Plot data
ObsRS1$Variable<- factor(ObsRS1$Variable, levels=c("shootbiomass","RootWt"))
E3ILL<-ObsRS1%>%
filter(ID=="E3ILL")
# simD1<-simD%>%
# mutate(Clock.Today = ymd_hms(Clock.Today))%>%
# dplyr::filter(Variable=="RootWt"|Variable=="shootbiomass")%>%
# dplyr::filter(Clock.Today>"2002-06-01")%>%
# dplyr::filter(Name=="Iversen_91DefoliationLL")
# simD1$Variable<- factor( simD1$Variable, levels=c("shootbiomass","RootWt"))
# Root.L<-Root.dfA%>%
# dplyr::filter(Name==c("Iversen_91DefoliationLL"))
#
E3ILL%>%
dplyr::filter(GrowthSeason.x=="1")%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
facet_grid(Variable~ID)+ggtitle(paste0("E3ILL","(Iversen_91DefoliationLL)"))+
#geom_point(data=Root.L,aes(x=Clock.Today1,y=RootWt,size=2))+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
#remove grid lines
theme(
panel.spacing=unit(.01, "lines"),
panel.border = element_rect(colour = "black",size=1),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black",size = 1),
axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
axis.text.y = element_text(face = "plain", color = "black", size = 14),
axis.title.x=element_text(face="bold",colour="black",size = 14),
axis.title.y=element_text(face="bold",colour="black",size = 14),
strip.background = element_rect(colour = "black", fill = "white",size=1),
strip.text.x = element_text(size=14, angle=0, face = "plain"),
strip.text.y = element_text(size=14, face="plain"),
legend.title = element_text(colour="black", size=14, face="bold"),
axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

#ggsave("D:/R/Pictures/C5/Yield//E3ILL.png", width=8, height=6, dpi=500)
ObsRS1$Variable<- factor(ObsRS1$Variable, levels=c("shootbiomass","RootWt"))
E3ILL<-ObsRS1%>%
filter(ID=="E3ILL")
# simD1<-simD%>%
# mutate(Clock.Today = ymd_hms(Clock.Today))%>%
# dplyr::filter(Variable=="RootWt"|Variable=="shootbiomass")%>%
# dplyr::filter(Clock.Today>"2002-06-01")%>%
# dplyr::filter(Name=="Iversen_91DefoliationLL")
# simD1$Variable<- factor( simD1$Variable, levels=c("shootbiomass","RootWt"))
# Root.L<-Root.dfA%>%
# dplyr::filter(Name==c("Iversen_91DefoliationLL"))
#
E3ILL%>%
dplyr::filter(GrowthSeason.x=="2")%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
facet_grid(Variable~ID)+ggtitle(paste0("E3ILL","(Iversen_91DefoliationLL)"))+
#geom_point(data=Root.L,aes(x=Clock.Today1,y=RootWt,size=2))+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
#remove grid lines
theme(
panel.spacing=unit(.01, "lines"),
panel.border = element_rect(colour = "black",size=1),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black",size = 1),
axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
axis.text.y = element_text(face = "plain", color = "black", size = 14),
axis.title.x=element_text(face="bold",colour="black",size = 14),
axis.title.y=element_text(face="bold",colour="black",size = 14),
strip.background = element_rect(colour = "black", fill = "white",size=1),
strip.text.x = element_text(size=14, angle=0, face = "plain"),
strip.text.y = element_text(size=14, face="plain"),
legend.title = element_text(colour="black", size=14, face="bold"),
axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

#ggsave("D:/R/Pictures/C5/Yield//E3ILL.png", width=8, height=6, dpi=500)
E3ILL%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
#geom_line(y=5500,size=2)+
facet_grid(Variable~ID)+ggtitle(paste0("E3ILL","(Iversen_91DefoliationLL)"))+
#geom_point(data=Root.L,aes(x=Clock.Today1,y=RootWt,size=2))+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
#remove grid lines
theme(
panel.spacing=unit(.01, "lines"),
panel.border = element_rect(colour = "black",size=1),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black",size = 1),
axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
axis.text.y = element_text(face = "plain", color = "black", size = 14),
axis.title.x=element_text(face="bold",colour="black",size = 14),
axis.title.y=element_text(face="bold",colour="black",size = 14),
strip.background = element_rect(colour = "black", fill = "white",size=1),
strip.text.x = element_text(size=14, angle=0, face = "plain"),
strip.text.y = element_text(size=14, face="plain"),
legend.title = element_text(colour="black", size=14, face="bold"),
axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

#ggsave("D:/R/Pictures/C5/Yield//E3ILL.png", width=8, height=6, dpi=500)
E5LS
obsDSR$Variable<- factor(obsDSR$Variable, levels=c("shootbiomass","RootWt"))
E3ILS<-obsDSR%>%
filter(ID=="E3ILS")
E3ILS%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
#geom_line(y=5500,size=2)+
facet_grid(Variable~ID)+ggtitle(paste0("E3ILS","(Iversen_91DefoliationLS)"))+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
#remove grid lines
theme(
panel.spacing=unit(.01, "lines"),
panel.border = element_rect(colour = "black",size=1),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black",size = 1),
axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
axis.text.y = element_text(face = "plain", color = "black", size = 14),
axis.title.x=element_text(face="bold",colour="black",size = 14),
axis.title.y=element_text(face="bold",colour="black",size = 14),
strip.background = element_rect(colour = "black", fill = "white",size=1),
strip.text.x = element_text(size=14, angle=0, face = "plain"),
strip.text.y = element_text(size=14, face="plain"),
legend.title = element_text(colour="black", size=14, face="bold"),
axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

#ggsave("D:/R/Pictures/C5/Yield//E3ILS.png", width=8, height=6, dpi=500)
E5SL
obsDSR$Variable<- factor(obsDSR$Variable, levels=c("shootbiomass","RootWt"))
E3ISL<-obsDSR%>%
filter(ID=="E3ISL")
E3ISL%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
facet_grid(Variable~ID)+ggtitle(paste0("E3ISL","(Iversen_91DefoliationSL)"))+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
#remove grid lines
theme(
panel.spacing=unit(.01, "lines"),
panel.border = element_rect(colour = "black",size=1),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black",size = 1),
axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
axis.text.y = element_text(face = "plain", color = "black", size = 14),
axis.title.x=element_text(face="bold",colour="black",size = 14),
axis.title.y=element_text(face="bold",colour="black",size = 14),
strip.background = element_rect(colour = "black", fill = "white",size=1),
strip.text.x = element_text(size=14, angle=0, face = "plain"),
strip.text.y = element_text(size=14, face="plain"),
legend.title = element_text(colour="black", size=14, face="bold"),
axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield//E3ISL.png", width=8, height=6, dpi=500)
E5ILLF2
ObsRS1$Variable<- factor(ObsRS1$Variable, levels=c("shootbiomass","RootWt"))
E5ILLF2<-ObsRS1%>%
filter(ID=="E5ILLF2")
# simD1<-simD%>%
# mutate(Clock.Today = ymd_hms(Clock.Today))%>%
# dplyr::filter(Variable=="RootWt"|Variable=="shootbiomass")%>%
# dplyr::filter(Clock.Today>"2002-06-01")%>%
# dplyr::filter(Name=="Iversen_91DefoliationLL")
# simD1$Variable<- factor( simD1$Variable, levels=c("shootbiomass","RootWt"))
# Root.L<-Root.dfA%>%
# dplyr::filter(Name==c("Iversen_91DefoliationLL"))
#
E5ILLF2%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
facet_grid(Variable~ID)+
#geom_point(data=Root.L,aes(x=Clock.Today1,y=RootWt,size=2))+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
#remove grid lines
theme(
panel.spacing=unit(.01, "lines"),
panel.border = element_rect(colour = "black",size=1),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black",size = 1),
axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
axis.text.y = element_text(face = "plain", color = "black", size = 14),
axis.title.x=element_text(face="bold",colour="black",size = 14),
axis.title.y=element_text(face="bold",colour="black",size = 14),
strip.background = element_rect(colour = "black", fill = "white",size=1),
strip.text.x = element_text(size=14, angle=0, face = "plain"),
strip.text.y = element_text(size=14, face="plain"),
legend.title = element_text(colour="black", size=14, face="bold"),
axis.text = element_text(face = "bold", vjust = 0.5, size = 14))
ggsave("D:/R/Pictures/C5/Yield//E5ILLF2.png", width=8, height=6, dpi=500)

E5ILLF10
ObsRS1$Variable<- factor(ObsRS1$Variable, levels=c("shootbiomass","RootWt"))
E5ILLF10<-ObsRS1%>%
filter(ID=="E5ILLF10")
# simD1<-simD%>%
# mutate(Clock.Today = ymd_hms(Clock.Today))%>%
# dplyr::filter(Variable=="RootWt"|Variable=="shootbiomass")%>%
# dplyr::filter(Clock.Today>"2002-06-01")%>%
# dplyr::filter(Name=="Iversen_91DefoliationLL")
# simD1$Variable<- factor( simD1$Variable, levels=c("shootbiomass","RootWt"))
# Root.L<-Root.dfA%>%
# dplyr::filter(Name==c("Iversen_91DefoliationLL"))
#
E5ILLF10%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
facet_grid(Variable~ID)+
#geom_point(data=Root.L,aes(x=Clock.Today1,y=RootWt,size=2))+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
#remove grid lines
theme(
panel.spacing=unit(.01, "lines"),
panel.border = element_rect(colour = "black",size=1),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black",size = 1),
axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
axis.text.y = element_text(face = "plain", color = "black", size = 14),
axis.title.x=element_text(face="bold",colour="black",size = 14),
axis.title.y=element_text(face="bold",colour="black",size = 14),
strip.background = element_rect(colour = "black", fill = "white",size=1),
strip.text.x = element_text(size=14, angle=0, face = "plain"),
strip.text.y = element_text(size=14, face="plain"),
legend.title = element_text(colour="black", size=14, face="bold"),
axis.text = element_text(face = "bold", vjust = 0.5, size = 14))
ggsave("D:/R/Pictures/C5/Yield//E5ILLF10.png", width=8, height=6, dpi=500)

proof
obsDSRR<-obsDSR%>%
filter(Variable=="RootWt")%>%
mutate(RootWt=Observed)
obsDSRS<-obsDSR%>%
filter(Variable=="shootbiomass")%>%
dplyr::select(Name,Clock.Today,Observed)%>%
mutate(shootbiomass=Observed)%>%
mutate(Clock.Today=ymd(Clock.Today))%>%
mutate(Name=factor(Name))
All<-merge(obsDSRR,obsDSRS,by=c("Clock.Today","Name"))%>%
mutate(Biomass=RootWt+shootbiomass)%>%
mutate(Proot=1-shootbiomass/Biomass)%>%
mutate(GrowthRotation=paste0(GrowthSeason,Rotation))
All%>%
filter(ExperimentID=="E3")%>%
unique()%>%
ggplot(aes(x=Clock.Today,y=Proot,color=ID,label=GrowthRotation))+geom_text()+
theme_bw()+
facet_wrap(~ID,ncol = 1)+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Proot")+
#remove grid lines
theme(
panel.spacing=unit(.01, "lines"),
panel.border = element_rect(colour = "black",size=1),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black",size = 1),
axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
axis.text.y = element_text(face = "plain", color = "black", size = 14),
axis.title.x=element_text(face="bold",colour="black",size = 14),
axis.title.y=element_text(face="bold",colour="black",size = 14),
strip.background = element_rect(colour = "black", fill = "white",size=1),
strip.text.x = element_text(size=14, angle=0, face = "plain"),
strip.text.y = element_text(size=14, face="plain"),
legend.title = element_text(colour="black", size=14, face="bold"),
axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield/E3Proot.png", width=8, height=6, dpi=500)
All%>%
filter(ExperimentID=="E5")%>%
ggplot(aes(x=Clock.Today,y=Proot,color=ID,label=GrowthRotation))+geom_text()+
theme_bw()+
facet_wrap(~ID,ncol = 1)+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Proot")+
#remove grid lines
theme(
panel.spacing=unit(.01, "lines"),
panel.border = element_rect(colour = "black",size=1),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black",size = 1),
axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
axis.text.y = element_text(face = "plain", color = "black", size = 14),
axis.title.x=element_text(face="bold",colour="black",size = 14),
axis.title.y=element_text(face="bold",colour="black",size = 14),
strip.background = element_rect(colour = "black", fill = "white",size=1),
strip.text.x = element_text(size=14, angle=0, face = "plain"),
strip.text.y = element_text(size=14, face="plain"),
legend.title = element_text(colour="black", size=14, face="bold"),
axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield/E5Proot.png", width=8, height=6, dpi=500)
Proot LL
ObsRS1R<-ObsRS1%>%
filter(Variable=="RootWt")%>%
mutate(RootWt=Observed)
ObsRS1S<-ObsRS1%>%
filter(Variable=="shootbiomass")%>%
dplyr::select(Name,Clock.Today,Observed)%>%
mutate(shootbiomass=Observed)%>%
mutate(Clock.Today=ymd(Clock.Today))%>%
mutate(Name=factor(Name))
LLAll<-merge(ObsRS1R,ObsRS1S,by=c("Clock.Today","Name"))%>%
filter(Tbb==1)%>%
mutate(Biomass=RootWt+shootbiomass)%>%
mutate(Proot=1-shootbiomass/Biomass)%>%
unique()
LLAll%>%
filter(ExperimentID=="E3")%>%
ggplot(aes(x=Clock.Today,y=Proot,color=ID,label=GrowthRotation))+geom_text()+
theme_bw()+
facet_wrap(~ID,ncol = 1)+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Proot")+
#remove grid lines
theme(
panel.spacing=unit(.01, "lines"),
panel.border = element_rect(colour = "black",size=1),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black",size = 1),
axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
axis.text.y = element_text(face = "plain", color = "black", size = 14),
axis.title.x=element_text(face="bold",colour="black",size = 14),
axis.title.y=element_text(face="bold",colour="black",size = 14),
strip.background = element_rect(colour = "black", fill = "white",size=1),
strip.text.x = element_text(size=14, angle=0, face = "plain"),
strip.text.y = element_text(size=14, face="plain"),
legend.title = element_text(colour="black", size=14, face="bold"),
axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield/E3LLProot.png", width=8, height=6, dpi=500)
LLAll%>%
filter(ExperimentID=="E5")%>%
filter(shootbiomass!="0")%>%
ggplot(aes(x=Clock.Today,y=Proot,color=ID,label=GrowthRotation))+geom_line(size=2)+
theme_bw()+
facet_wrap(~ID,ncol = 1)+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Proot")+
#remove grid lines
theme(
panel.spacing=unit(.01, "lines"),
panel.border = element_rect(colour = "black",size=1),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black",size = 1),
axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
axis.text.y = element_text(face = "plain", color = "black", size = 14),
axis.title.x=element_text(face="bold",colour="black",size = 14),
axis.title.y=element_text(face="bold",colour="black",size = 14),
strip.background = element_rect(colour = "black", fill = "white",size=1),
strip.text.x = element_text(size=14, angle=0, face = "plain"),
strip.text.y = element_text(size=14, face="plain"),
legend.title = element_text(colour="black", size=14, face="bold"),
axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield/E5LLProot.png", width=8, height=6, dpi=500)
Cum oberved
ungroup.rowwise_df <- function(x) {
class(x) <- c( "tbl_df", "data.frame")
x
}
E5IHHFD5S<-E5IHHFD5%>%
dplyr::filter(Variable=="shootbiomass")
uniGY <- unique(E5IHHFD5S$ExpUnitCode)
df.all <- data.frame()
for(i in 1:length(uniGY)){
cum<-E5IHHFD5S%>%
rowwise() %>%
mutate(GrowthRotation=paste0(GrowthRotation,Rotation))%>%
ungroup.rowwise_df()%>%
mutate(Shoot=cumsum(Observed))
df.all <- rbind(df.all,cum)
}
summary(df.all)
Name Collection Experiment Water Defoliation SowingDate FD
Iversen_121DefoliationHHFDFD5 :615 2002_2004: 0 Lincoln2002: 0 irr:615 HH:615 no:615 FD10: 0
Iversen_121DefoliationHHFDFD10: 0 2014_2018:615 Lincoln2003: 0 LS: 0 No: 0 FD2 : 0
Iversen_121DefoliationHHFDFD2 : 0 Lincoln2004: 0 SL: 0 FD5 :615
Iversen_121DefoliationSSFDFD10: 0 Lincoln2015:615 SS: 0
Iversen_121DefoliationSSFDFD2 : 0 Lincoln2016: 0
Iversen_121DefoliationSSFDFD5 : 0
(Other) : 0
GrowthSeason Rotation StartDate MidDate FinishDate Interval
Min. :1.000 Min. :1.000 Min. :2014-11-03 Min. :2014-12-16 Min. :2015-01-29 Min. : 0.00
1st Qu.:1.000 1st Qu.:1.000 1st Qu.:2015-04-30 1st Qu.:2015-03-13 1st Qu.:2015-09-01 1st Qu.: 0.00
Median :2.000 Median :2.000 Median :2016-02-26 Median :2016-04-05 Median :2016-05-15 Median :41.00
Mean :2.366 Mean :2.171 Mean :2016-04-26 Mean :2016-05-27 Mean :2016-07-22 Mean :41.73
3rd Qu.:3.000 3rd Qu.:3.000 3rd Qu.:2017-04-21 3rd Qu.:2017-06-03 3rd Qu.:2017-07-16 3rd Qu.:80.00
Max. :4.000 Max. :4.000 Max. :2018-04-21 Max. :2018-05-31 Max. :2018-07-10 Max. :98.00
Variable VariableUnits Period Clock.Today Time Observed StdDEV
shootbiomass:615 kg/ha :615 02_03: 0 Min. :2014-11-03 12:00:00:615 Min. : 0.0 Min. : 0.00
RootWt : 0 % : 0 03_04: 0 1st Qu.:2015-06-18 1st Qu.: 0.0 1st Qu.: 0.00
cm : 0 04_05: 0 Median :2016-05-15 Median : 894.8 Median : 0.00
Fraction : 0 14_15:180 Mean :2016-06-03 Mean :2004.4 Mean : 47.74
fractional: 0 15_16:165 3rd Qu.:2017-04-21 3rd Qu.:3158.0 3rd Qu.: 0.00
franction : 0 16_17:135 Max. :2018-04-21 Max. :9710.6 Max. :673.38
(Other) : 0 17_18:135
ExperimentID Treatment ID GrowthSeason1 Rotation1 ExpUnitCode
E3: 0 IHHF5 :615 E5IHHF5 :615 Gs_1:180 Rt_1 :225 Iversen_121DefoliationHHFDFD5Gs_1Rt_1: 90
E5:615 IHHF10 : 0 E3ILS : 0 Gs_2:165 Rt_2 :150 Iversen_121DefoliationHHFDFD5Gs_1Rt_2: 45
IHHF2 : 0 E3ISL : 0 Gs_3:135 Rt_3 :150 Iversen_121DefoliationHHFDFD5Gs_1Rt_3: 45
ILS : 0 E3ISS : 0 Gs_4:135 Rt_4 : 90 Iversen_121DefoliationHHFDFD5Gs_2Rt_1: 45
ISL : 0 E5IHHF10: 0 Gs_5: 0 Rt_10 : 0 Iversen_121DefoliationHHFDFD5Gs_2Rt_2: 45
ISS : 0 E5IHHF2 : 0 Rt_5 : 0 Iversen_121DefoliationHHFDFD5Gs_2Rt_3: 45
(Other): 0 (Other) : 0 (Other): 0 (Other) :300
Clock.Today1 GrowthSeason2 Rotation2 GrowthRotation Shoot
Min. :2014-11-03 12:00:00 Y1(14_15):180 R1 :225 Length:615 Min. : 2115
1st Qu.:2015-06-18 12:00:00 Y2(15_16):165 R2 :150 Class :character 1st Qu.:37714
Median :2016-05-15 12:00:00 Y3(16_17):135 R3 :150 Mode :character Median :74276
Mean :2016-06-04 09:40:58 Y4(17_18):135 R4 : 90 Mean :58547
3rd Qu.:2017-04-21 12:00:00 Y1(02_03): 0 R10 : 0 3rd Qu.:82182
Max. :2018-04-21 12:00:00 Y1(15_16): 0 R5 : 0 Max. :82182
(Other) : 0 (Other): 0
df.all
load Root and shoot data for SS
obsDSR$Variable<- factor(obsDSR$Variable, levels=c("shootbiomass","RootWt"))
E5ISSFD5<-obsDSR%>%
filter(ID=="E5ISSF5")
E5ISSFD5%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
facet_grid(Variable~ID)+ggtitle(paste0("E5ISSF5"))+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
#remove grid lines
theme(
panel.spacing=unit(.01, "lines"),
panel.border = element_rect(colour = "black",size=1),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black",size = 1),
axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
axis.text.y = element_text(face = "plain", color = "black", size = 14),
axis.title.x=element_text(face="bold",colour="black",size = 14),
axis.title.y=element_text(face="bold",colour="black",size = 14),
strip.background = element_rect(colour = "black", fill = "white",size=1),
strip.text.x = element_text(size=14, angle=0, face = "plain"),
strip.text.y = element_text(size=14, face="plain"),
legend.title = element_text(colour="black", size=14, face="bold"),
axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield//E5ISSF5.png", width=8, height=6, dpi=500)
load Root and shoot data for LL
ObsRS1$Variable<- factor(ObsRS1$Variable, levels=c("shootbiomass","RootWt"))
E5ILLF5<-ObsRS1%>%
filter(ID=="E5ILLF5")
E5ILLF5%>%
ggplot(aes(x=Clock.Today,y=Observed,color=Variable))+geom_line(size=1)+theme_bw()+
geom_point(aes(x=Clock.Today,y=Observed))+geom_point(size=3)+
facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab("Biomass (kg/ha)")+
#remove grid lines
theme(
panel.spacing=unit(.01, "lines"),
panel.border = element_rect(colour = "black",size=1),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black",size = 1),
axis.text.x = element_text(face = "plain", color = "black", size = 14, vjust=0.5, hjust = 1),
axis.text.y = element_text(face = "plain", color = "black", size = 14),
axis.title.x=element_text(face="bold",colour="black",size = 14),
axis.title.y=element_text(face="bold",colour="black",size = 14),
strip.background = element_rect(colour = "black", fill = "white",size=1),
strip.text.x = element_text(size=14, angle=0, face = "plain"),
strip.text.y = element_text(size=14, face="plain"),
legend.title = element_text(colour="black", size=14, face="bold"),
axis.text = element_text(face = "bold", vjust = 0.5, size = 14))

ggsave("D:/R/Pictures/C5/Yield//E5ILLF5.png", width=8, height=6, dpi=500)
load Root data analysis data frame
upDir <- "D:/R/"
Rootdf <- "D:/R/CombinedData/"
Root.df<- read.table(paste0(Rootdf, "Root.dataframe.txt"),
header = TRUE)
Root.dfA <- Root.df %>% mutate(Clock.Today=dmy(Clock.Today),
StartDate=dmy(StartDate),FinishDate=dmy(FinishDate),
StartDate1=dmy(StartDate1),FinishDate1=dmy(FinishDate1))%>%
mutate(Clock.Today1 = as.POSIXct(paste(Clock.Today,Time),format="%Y-%m-%d %H:%M:%S"))
remoblisation rate
ReRoot.Rate<-ReRoot%>%
mutate(Re.rate=ChangeWt/ChangeTt)%>%
mutate(Re.rate.Pp=Re.rate/ChangePp)
ReRoot.Rate%>%
ggplot(aes(x=IRW,y=Re.rate, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")

Root.LS<-Root.dfA%>%
dplyr::filter(Name==c("Iversen_91DefoliationLS"))%>%
dplyr::filter(Trend=="RB")
Root.SL<-Root.dfA%>%
dplyr::filter(Name==c("Iversen_91DefoliationSL"))%>%
dplyr::filter(Trend=="RB")
Root.SS<-Root.dfA%>%
dplyr::filter(Name==c("Iversen_91DefoliationSS"))%>%
dplyr::filter(Trend=="RB")
Root.SSa<-Root.dfA%>%
dplyr::filter(Name==c("Iversen_121DefoliationSSFDFD5"))%>%
dplyr::filter(Trend=="RB")
RootSS<-rbind(Root.LS,Root.SL,Root.SS,Root.SSa)
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------
Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>
The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:
here
The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:
arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn1 <- function(RootSS){
m <- lm(ChangeWt~IRW , RootSS);
eq <- substitute(italic(y) == IRW + ChangeWt %.% italic(IRW)*","~~italic(R)^2~"="~r2,
list(IRW= format(coef(m)[1], digits = 2),
ChangeWt = format(coef(m)[2], digits = 2),
r2 = format(summary(m)$r.squared, digits = 3)))
as.character(as.expression(eq));
}
eqs1 <- ddply(RootSS,.(Trend),lm_eqn1)
RootSS%>%
ggplot(aes(x=IRW,y=ChangeWt, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+xlab(bquote(bold('Intial root biomass ('*kg~DM~ha^-1*')')))+ylab(bquote(bold('Remoblisation lost ('*kg~DM~ha^-1*')')))+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
geom_text(data = eqs1, aes(x =4000, y =2500, label = V1),
color = 'black', parse = TRUE)

detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield//Remoblisationss.png", width=8, height=6, dpi=500)
Root.dfA1<-Root.dfA%>%
dplyr::filter(Trend=="RB")
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------
Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>
The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:
here
The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:
arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn1 <- function(Root.dfA1){
m <- lm(ChangeWt~IRW , Root.dfA1);
eq <- substitute(italic(y) == IRW + ChangeWt %.% italic(IRW)*","~~italic(R)^2~"="~r2,
list(IRW= format(coef(m)[1], digits = 2),
ChangeWt = format(coef(m)[2], digits = 2),
r2 = format(summary(m)$r.squared, digits = 3)))
as.character(as.expression(eq));
}
eqs1 <- ddply(Root.dfA1,.(Trend),lm_eqn1)
Root.dfA1%>%
ggplot(aes(x=IRW,y=ChangeWt, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+xlab(bquote(bold('Intial root biomass ('*kg~DM~ha^-1*')')))+ylab(bquote(bold('Remoblisation lost ('*kg~DM~ha^-1*')')))+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
geom_text(data = eqs1, aes(x =6000, y =6000, label = V1),
color = 'black', parse = TRUE)
detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield//RemoblisationALL.png", width=8, height=6, dpi=500)

Root.dfA1<-Root.dfA%>%
dplyr::filter(Trend=="RB")%>%
mutate(Per=ChangeWt/IRW)
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------
Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>
The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:
here
The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:
arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn1 <- function(Root.dfA1){
m <- lm(Per~IRW , Root.dfA1);
eq <- substitute(italic(y) == IRW + Per %.% italic(IRW)*","~~italic(R)^2~"="~r2,
list(IRW= format(coef(m)[1], digits = 2),
Per = format(coef(m)[2], digits = 2),
r2 = format(summary(m)$r.squared, digits = 3)))
as.character(as.expression(eq));
}
eqs11 <- ddply(Root.dfA1,.(Trend),lm_eqn1)
Root.dfA1%>%
ggplot(aes(x=IRW,y=Per, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+xlab(bquote(bold('Intial root biomass ('*kg~DM~ha^-1*')')))+ylab("Remoblisation lost(%)")+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
geom_text(data = eqs11, aes(x =6000, y =0.75, label = V1),
color = 'black', parse = TRUE)
detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield//RemoblisationALLper.png", width=8, height=6, dpi=500)

Root.dfA1<-Root.dfA%>%
dplyr::filter(Trend=="RB")
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------
Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>
The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:
here
The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:
arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
my.formula <- function(Root.dfA1){
my.formula <- ChangeWt ~ poly(IRW, 2, raw = TRUE)
m <- lm(my.formula, Root.dfA1)
my.eq <- as.character(signif(as.polynomial(coef(m)), 2))
label.text <- paste("y","'='",paste(gsub("y", "~italic(x)",my.eq, fixed = TRUE)),
paste("italic(R)^2",format(summary(m)$r.squared, digits = 2),
sep = "~`=`~"),
sep = "~~~~")
as.character(as.expression(label.text));
}
my.eqs <- ddply(Root.dfA1,.(FD),my.formula)
b<-Root.dfA1%>%
ggplot(aes(x=IRW,y=ChangeWt, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+xlab(bquote(bold('Intial root biomass ('*kg~DM~ha^-1*')')))+ylab(bquote(bold('Remoblisation lost ('*kg~DM~ha^-1*')')))+
geom_smooth(method = "lm", se = TRUE, formula=y ~ poly(x, 2, raw=TRUE), colour="darkgrey")+
theme(legend.title = element_blank())
b+geom_text(data = my.eqs, aes(x = 6000, y = 6000, label = V1),
color = 'black', parse = TRUE, size=4)
detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield/RemoblisationALLploy2.png", width=8, height=6, dpi=500)

Root.dfA1<-Root.dfA%>%
dplyr::filter(Trend=="RB")
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------
Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>
The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:
here
The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:
arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
my.formula <- function(Root.dfA1){
my.formula <- ChangeWt ~ poly(IRW, 3, raw = TRUE)
m <- lm(my.formula, Root.dfA1)
my.eq <- as.character(signif(as.polynomial(coef(m)), 2))
label.text <- paste("y","'='",paste(gsub("y", "~italic(x)",my.eq, fixed = TRUE)),
paste("italic(R)^2",format(summary(m)$r.squared, digits = 2),
sep = "~`=`~"),
sep = "~~~~")
as.character(as.expression(label.text));
}
my.eqs <- ddply(Root.dfA1,.(FD),my.formula)
b<-Root.dfA1%>%
ggplot(aes(x=IRW,y=ChangeWt, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+xlab(bquote(bold('Intial root biomass ('*kg~DM~ha^-1*')')))+ylab(bquote(bold('Remoblisation lost ('*kg~DM~ha^-1*')')))+
geom_smooth(method = "lm", se = TRUE, formula=y ~ poly(x, 3, raw=TRUE), colour="darkgrey")+
theme(legend.title = element_blank())
b+geom_text(data = my.eqs, aes(x = 6800, y = 6000, label = V1),
color = 'black', parse = TRUE, size=4)
detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield//RemoblisationALLploy3.png", width=8, height=6, dpi=500)

remoblisation rate
Root.dfALL<-Root.dfA1%>%
mutate(Re.rate=ChangeWt/ChangeTt)%>%
mutate(Re.rate.Pp=Re.rate/ChangePp)
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------
Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>
The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:
here
The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:
arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn1 <- function(Root.dfALL){
m <- lm(Re.rate~IRW , Root.dfALL);
eq <- substitute(italic(y) == IRW + Re.rate %.% italic(IRW)*","~~italic(R)^2~"="~r2,
list(IRW= format(coef(m)[1], digits = 2),
Re.rate = format(coef(m)[2], digits = 2),
r2 = format(summary(m)$r.squared, digits = 3)))
as.character(as.expression(eq));
}
eqs11 <- ddply(Root.dfALL,.(Trend),lm_eqn1)
Root.dfALL%>%
ggplot(aes(x=IRW,y=Re.rate, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+
xlab(bquote(bold('Intial root biomass ('*kg~ha^-1*')')))+ylab(bquote(bold('Remoblisation rate ('*kg~cd^-1*')')))+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
geom_text(data = eqs11, aes(x =6000, y =4, label = V1),
color = 'black', parse = TRUE)
detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield//Remoblisation rate.png", width=8, height=6, dpi=500)

root respiration rate SS
RootSS.Rate<-RootSS%>%
mutate(Re.rate=ChangeWt/ChangeTt)%>%
mutate(Re.rate.Pp=Re.rate/ChangePp)
RootSS.Rate%>%
ggplot(aes(x=IRW,y=Re.rate, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")

when partitioning start? Pp
Root.PT<-Root.dfA%>%
filter(Trend=="PT")%>%
mutate(Pt.rate=ChangeWt/ChangeTt)%>%
mutate(Pt.rate.Pp=Pt.rate/ChangePp)%>%
mutate(PTR=ChangeWt/IRW)
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------
Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>
The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:
here
The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:
arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn1 <- function(Root.PT){
m <- lm(HRW~IRW , Root.PT);
eq <- substitute(italic(y) == IRW+ HRW %.% italic(IRW)*","~~italic(R)^2~"="~r2,
list(IRW= format(coef(m)[1], digits = 2),
HRW = format(coef(m)[2], digits = 2),
r2 = format(summary(m)$r.squared, digits = 3)))
as.character(as.expression(eq));
}
eqs12 <- ddply(Root.PT,.(Trend),lm_eqn1)
Root.PT%>%
ggplot(aes(x=IRW,y=HRW, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+ggtitle("Recharging potential ")+
xlab(bquote(bold('Inital root biomass ('*kg~ha^-1*')')))+ylab(bquote(bold('Maximum root bomass ('*kg~ha^-1*')')))+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
geom_text(data = eqs12, aes(x =4000, y =8800, label = V1),
color = 'black', parse = TRUE)
detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield//Rechanging potential.png", width=8, height=6, dpi=500)

when partitioning start? Pp
Recharging rate
Root.PT<-Root.dfA%>%
filter(Trend=="PT")%>%
mutate(Pt.rate=ChangeWt/ChangeTt)%>%
mutate(Pt.rate.Pp=Pt.rate/ChangePp)%>%
mutate(PTR=ChangeWt/IRW)
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------
Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>
The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:
here
The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:
arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn1 <- function(Root.PT){
m <- lm(HRW~Pt.rate , Root.PT);
eq <- substitute(italic(y) == Pt.rate+ HRW %.% italic(Pt.rate)*","~~italic(R)^2~"="~r2,
list(Pt.rate= format(coef(m)[1], digits = 2),
HRW = format(coef(m)[2], digits = 2),
r2 = format(summary(m)$r.squared, digits = 3)))
as.character(as.expression(eq));
}
eqs12 <- ddply(Root.PT,.(Trend),lm_eqn1)
Root.PT%>%
ggplot(aes(x=Pt.rate,y=HRW, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+ggtitle("Recharging rate ")+
xlab(bquote(bold('Recharging rate ('*kg~cd^-1*')')))+ylab(bquote(bold('Maximum root bomass ('*kg~ha^-1*')')))+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
geom_text(data = eqs12, aes(x =2, y =8800, label = V1),
color = 'black', parse = TRUE)
detach(package:plyr)
ggsave("D:/R/Pictures/C5/Yield//Rechanging rate.png", width=8, height=6, dpi=500)

RootPT in LL and HH
Root.PTLH<-Root.PT%>%
dplyr::filter(ID!="E3ILL")%>%
dplyr::filter(ID!="E5ILLF5")%>%
dplyr::filter(ID!="E5IHHF5")
Root.PTLH%>%
ggplot(aes(x=IRW,y=ChangeWt, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+ggtitle("Recharging potential")

#geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")
Root.PTLH%>%
ggplot(aes(x=IRW,y=Pt.rate, color=ID))+geom_point(size=2)+theme_bw()+mytheme3+ggtitle("Recharging potential")

#geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")
Respiration Rate and intial biomass
Root.dfR<-Root.dfA%>%
filter(Trend=="RP")%>%
mutate(RP.rate=ChangeWt/ChangeTt)%>%
mutate(GrowthRotation=paste(GrowthSeason,Rotation))
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------
Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>
The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:
here
The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:
arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn1 <- function(Root.dfR){
m <- lm(RP.rate~IRW , Root.dfR);
eq <- substitute(italic(y) == IRW+ RP.rate %.% italic(RP.rate)*","~~italic(R)^2~"="~r2,
list(IRW= format(coef(m)[1], digits = 2),
RP.rate = format(coef(m)[2], digits = 2),
r2 = format(summary(m)$r.squared, digits = 3)))
as.character(as.expression(eq));
}
eqs12 <- ddply(Root.dfR,.(Trend),lm_eqn1)
detach(package:plyr)
Root.dfR%>%
ggplot(aes(x=IRW, y=RP.rate,color=ID,label=GrowthRotation))+geom_text()+theme_bw()+mytheme3+
xlab(bquote(bold('Intial root biomass ('*kg~DM~ha^-1*')')))+ylab(bquote(bold('Repiration rate ('*kg~Cd^-1*')')))+ggtitle("Respiration in Winter")+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
geom_text(data = eqs12, aes(y=6, x =5000, label = V1),
color = 'black', parse = TRUE)

ggsave("D:/R/Pictures/C5/Yield/Respiartion rate.png", width=8, height=4, dpi=500)
write.csv(Root.dfR,"D:/R/Respiration/Root.dfR.csv", row.names = FALSE)
respiration and structural root biomass
structural root is percentage of total root biomass
Root.dfper<-Root.dfA%>%
filter(Trend=="RP")%>%
mutate(Per=1-ChangeTt/IRW)%>%
mutate(GrowthRotation=as.factor(paste(GrowthSeason,Rotation)))%>%
dplyr::filter(GrowthSeason!="2"|Rotation!="10")
library(plyr)
-------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------
Attaching package: <U+393C><U+3E31>plyr<U+393C><U+3E32>
The following object is masked from <U+393C><U+3E31>package:lubridate<U+393C><U+3E32>:
here
The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:
arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
lm_eqn11 <- function(Root.dfper){
m <- lm(ChangeWt~IRW , Root.dfper);
eq <- substitute(italic(y) == IRW+ ChangeWt %.% italic(ChangeWt)*","~~italic(R)^2~"="~r2,
list(IRW= format(coef(m)[1], digits = 2),
ChangeWt = format(coef(m)[2], digits = 2),
r2 = format(summary(m)$r.squared, digits = 3)))
as.character(as.expression(eq));
}
eqs13 <- ddply(Root.dfper,.(Trend),lm_eqn11)
detach(package:plyr)
Root.dfper%>%
ggplot(aes(x=IRW, y=ChangeWt,color=ID,label=GrowthRotation))+geom_text()+theme_bw()+mytheme3+
xlab(bquote(bold('Initial root biomass ('*kg~ha^-1*')')))+ylab(bquote(bold('Root respiration ('*kg~ha^-1*')')))+ggtitle("Respiration in Winter")+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")+
geom_text(data = eqs13, aes(y=2000, x =6000, label = V1),
color = 'black', parse = TRUE)
ggsave("D:/R/Pictures/C5/Yield/rootsturctural.png", width=8, height=4, dpi=500)

#write.csv(Root.dfR,"D:/R/Respiration/Root.dfR.csv", row.names = FALSE)
###structural root biomass=2491.30
daily winter respiration
upDir <- "D:/R/"
Rootdf <- "D:/R/Respiration/"
RootResp<- read.table(paste0(Rootdf, "RootResp.txt"),
header = TRUE)
Root.resp <- RootResp %>% mutate(Clock.Today=dmy(Clock.Today))%>%
filter(FinialRW!="NA")%>%
dplyr::select(Name,Clock.Today,Tearth,GrowthRotation,FinialRW,Rm_root_day1,Rm_root_day2,Rm_root_day3, Rm_root_day4, Rm_root_day5,Rm_root_day6,Rm_root_day7,Rm_root_day8,Rm_root_day9,Rm_root_day10) %>%
tidyr::gather("Variable","Predicted",Rm_root_day1:Rm_root_day10)
#filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
#filter(Name!="Iversen_121DefoliationHHFDFD5")
Root.resp$Variable<- factor(Root.resp$Variable, levels=c("Rm_root_day1", "Rm_root_day2", "Rm_root_day3", "Rm_root_day4", "Rm_root_day5","Rm_root_day6", "Rm_root_day7","Rm_root_day8","Rm_root_day9","Rm_root_day10"))
Root.resp%>%
ggplot(aes(x=FinialRW, y= Predicted, colour= factor(Name))) +
geom_point(size=2)+theme_bw()+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
geom_abline(intercept = 0, slope = 1) +
coord_fixed(ratio = 1)+
ggtitle("Root biomass")+
facet_wrap(~Variable, ncol = 4)+
theme_bw()+mytheme3+
scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
ylab("Predicted")+xlab("Observed")+ggtitle("Respiration in Winter")+ theme(legend.title=element_blank(),legend.position = "blank")

ggsave("D:/R/Pictures/C5/Yield/Rm_root_day.png", width=8, height=8, dpi=500)
Test stats functions used
s <- c(4231.972,3935.604,3779.652,3627.687,3363.499,3230.566,2868.114,2868.827)
m <- c(4987.66,5636.09,4754.06,4114.53,4141.72,3704.06,5142.19,4762.03)
x <- gauchStats(s,m)
tempDf <- data.frame(statName=c("SB","NU","LC","r_MSD","R2"), statValue=x)
# kable(tempDf, digits= 2)
tempDf2 <- data.frame(Predicted=s, Observed=m)
x <- tempDf2 %>%
summarise(
n = n(),
r2 = gauchStats(Predicted,Observed)[5],
# rmse = round(rmse(Predicted,Observed),0),
r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
nse = round(NSE(Predicted,Observed),1),
sb = gauchStats(Predicted,Observed)[1],
nu = gauchStats(Predicted,Observed)[2],
lc = gauchStats(Predicted,Observed)[3]
) %>%
t()
df <- data.frame(stat = row.names(x),statvalue = x[,1])
df %>%
kable(format = "markdown")
| n |
n |
8.0 |
| r2 |
r2 |
7.1 |
| r_rmse |
r_rmse |
28.7 |
| nse |
nse |
-4.1 |
| sb |
sb |
76.5 |
| nu |
nu |
5.2 |
| lc |
lc |
18.2 |
Root.resp$Variable<- factor(Root.resp$Variable, levels=c("Rm_root_day1", "Rm_root_day2", "Rm_root_day3", "Rm_root_day4", "Rm_root_day5","Rm_root_day6", "Rm_root_day7","Rm_root_day8","Rm_root_day9","Rm_root_day10"))
Root.resp %>%
mutate(Observed=FinialRW)%>%
#filter(Name!="Iversen_121DefoliationHHFDFD5")%>%
group_by(Variable) %>%
summarise(
n = n(),
r2 = gauchStats(Predicted,Observed)[5],
# rmse = round(rmse(Predicted,Observed),0),
r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
nse = round(NSE(Predicted,Observed),1),
sb = gauchStats(Predicted,Observed)[1],
nu = gauchStats(Predicted,Observed)[2],
lc = gauchStats(Predicted,Observed)[3]
)
###1=0.013,0.015, 0.02, 0.025,0.028, 0.03, 0.035,0.04,(0.045),0.05
daily winter respiration with structural root biomass
upDir <- "D:/R/"
Rootdf <- "D:/R/Respiration/"
RootResp<- read.table(paste0(Rootdf, "RootRespStru.txt"),
header = TRUE)
Root.resp.stru <- RootResp %>% mutate(Clock.Today=dmy(Clock.Today))%>%
filter(FinialRW!="NA")%>%
dplyr::select(Name,Clock.Today,Tearth,GrowthRotation,FinialRW,Rm_root_day1,Rm_root_day2,Rm_root_day3, Rm_root_day4, Rm_root_day5,Rm_root_day6,Rm_root_day7,Rm_root_day8,Rm_root_day9,Rm_root_day10,Rm_root_day11,Rm_root_day12,Rm_root_day13,Rm_root_day14,Rm_root_day15,Rm_root_day16,Rm_root_day17,Rm_root_day18,Rm_root_day19,Rm_root_day20) %>%
tidyr::gather("Variable","Predicted",Rm_root_day1:Rm_root_day20)
#filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
#filter(Name!="Iversen_121DefoliationHHFDFD5")
Root.resp.stru$Variable<- factor(Root.resp.stru$Variable, levels=c("Rm_root_day1", "Rm_root_day2", "Rm_root_day3", "Rm_root_day4", "Rm_root_day5","Rm_root_day6", "Rm_root_day7","Rm_root_day8","Rm_root_day9","Rm_root_day10","Rm_root_day11","Rm_root_day12","Rm_root_day13","Rm_root_day14","Rm_root_day15","Rm_root_day16","Rm_root_day17","Rm_root_day18","Rm_root_day19","Rm_root_day20"))
Root.resp.stru%>%
ggplot(aes(x=FinialRW, y= Predicted, colour= factor(Name))) +
geom_point(size=2)+theme_bw()+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
geom_abline(intercept = 0, slope = 1) +
coord_fixed(ratio = 1)+
ggtitle("Root biomass")+
facet_wrap(~Variable, ncol = 5)+
theme_bw()+mytheme3+
scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
ylab("Predicted")+xlab("Observed")+ggtitle("Respiration in Winter")+ theme(legend.title=element_blank(),legend.position = "blank")

ggsave("D:/R/Pictures/C5/Yield/Rm_root_dayStru.png", width=8, height=10, dpi=500)
analysis
Root.resp.stru$Variable<- factor(Root.resp.stru$Variable, levels=c("Rm_root_day1", "Rm_root_day2", "Rm_root_day3", "Rm_root_day4", "Rm_root_day5","Rm_root_day6", "Rm_root_day7","Rm_root_day8","Rm_root_day9","Rm_root_day10","Rm_root_day11","Rm_root_day12","Rm_root_day13","Rm_root_day14","Rm_root_day15","Rm_root_day16","Rm_root_day17","Rm_root_day18","Rm_root_day19","Rm_root_day20"))
Root.resp.stru %>%
mutate(Observed=FinialRW)%>%
#filter(Name!="Iversen_121DefoliationHHFDFD5")%>%
group_by(Variable) %>%
summarise(
n = n(),
r2 = gauchStats(Predicted,Observed)[5],
# rmse = round(rmse(Predicted,Observed),0),
r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
nse = round(NSE(Predicted,Observed),1),
sb = gauchStats(Predicted,Observed)[1],
nu = gauchStats(Predicted,Observed)[2],
lc = gauchStats(Predicted,Observed)[3]
)
###1=0.013,0.018, 0.02, 0.025, 0.03, 0.035, 0.04, 0.045, 0.05, 0.055, 0.06, 0.065, 0.07, 0.075, 0.08, (0.085),0.09,0.095,0.1, 0.15.
New ananlysis
Interpuolate PARi
load data
upDir <- "D:/R/CombinedData/"
obsData <- "D:/R/CombinedData/"
Rootmet <- read.table(paste0(obsData, "RootMet.txt"),
header = TRUE) %>%
dplyr::filter(ExpName!="Iversen_91DefoliationLSGs_1Rt_8")%>%
dplyr::filter(ExpName!="Iversen_121DefoliationLLFDFD5Gs_3Rt_6")
Interpoluate
Interpolate temperature factor
# Create a TT linear interpolation function
# Aim: Interpolates linearly between two known x-y pairs
int_func <- function(temp,TT,temp_ref){
# if temp is too low or too high give extreme TT values
if(temp_ref>temp[length(temp)]) {
out <- TT[length(TT)]
} else if (temp_ref<temp[1]) {
out <- TT[1]
} else {
# else interpolate
tryCatch(
out <- approx(temp, TT, xout = temp_ref,
method="linear",
rule = 2)$y,
error = function(e)
{
out <- NA
}
)
} # end if check
return(out)
}
# Test and test interpolation function
# Set an input cardinal temperature df
tt_card <- data.frame(x_ref=c(1.0, 5.0, 10, 15, 30, 40),
y_ref=c(0.0, 3.0, 6.5, 10, 25, 0.0))
temp_ref <- 25 # random input x-axes value to test
temp <- tt_card$x_ref # x-axes
TT <- tt_card$y_ref # y-axes
int_func(temp,TT,temp_ref) # result must be 20
[1] 20
interpoluate as x and y pairs
t_factor <- data.frame(x_ref=c(0.0, 18, 30, 40),
y_ref=c(0.0, 1.0, 1.0, 0.0))
Tem.factor<-Rootmet %>%
mutate(T.factor=int_func(t_factor$x_ref,t_factor$y_ref, mean))%>%
#mutate(potentialProduction=PARi*16.2*T.factor)%>% ###RUE =1.62
mutate(Clock.Today=dmy(Clock.Today))%>%
mutate(ExpUnitCode=as.factor(ExpName))
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used
Tem.factor
write.csv(Tem.factor ,"D:/R/Respiration/Tem.factor.csv", row.names = FALSE)
fPAR interpolate for each rotation
RUE testing
UniExp <- unique(Tem.factor$ExpName)
fPAR.df <- data.frame()
for(i in 1:length(UniExp))
{
RootmetfPAR<-Tem.factor %>%
filter(ExpName==UniExp[i])%>%
mutate(Tt_broken_sum=as.numeric(Tt_broken_sum))
fPAR.data<-RootmetfPAR%>%
mutate(fPAR=approx(Tt_broken_sum, Franction, xout =Tt_broken_sum,
method="linear",
rule = 2)$y)%>% ##interpolate function
mutate(PARi=radn*fPAR)%>%
unique()%>%
##accmulated function
mutate(Production.day0 = PARi*7.2*T.factor)%>% ###RUE is 0.72g/MJ
mutate(Production.sum0 = cumsum(Production.day0))%>%
mutate(Production.day1 = PARi*7.7*T.factor)%>% ###RUE is 0.77g/MJ
mutate(Production.sum1 = cumsum(Production.day1))%>%
mutate(Production.day2 = PARi*8.2*T.factor)%>% ###RUE is 0.82g/MJ
mutate(Production.sum2 = cumsum(Production.day2))%>%
mutate(Production.day3 = PARi*8.7*T.factor)%>% ###RUE is 0.87g/MJ
mutate(Production.sum3 = cumsum(Production.day3))%>%
mutate(Production.day3A = PARi*8.8*T.factor)%>% ###RUE is 0.88g/MJ
mutate(Production.sum3A = cumsum(Production.day3A))%>%
mutate(Production.day3B = PARi*8.9*T.factor)%>% ###RUE is 0.89g/MJ
mutate(Production.sum3B = cumsum(Production.day3B))%>%
mutate(Production.day3C = PARi*9.0*T.factor)%>% ###RUE is 0.90g/MJ
mutate(Production.sum3C = cumsum(Production.day3C))%>%
mutate(Production.day3D = PARi*9.1*T.factor)%>% ###RUE is 0.91g/MJ
mutate(Production.sum3D = cumsum(Production.day3D))%>%
mutate(Production.day4 = PARi*9.2*T.factor)%>% ###RUE is 0.92g/MJ
mutate(Production.sum4 = cumsum(Production.day4))%>%
mutate(Production.day4A = PARi*9.3*T.factor)%>% ###RUE is 0.93g/MJ
mutate(Production.sum4A = cumsum(Production.day4A))%>%
mutate(Production.day4B = PARi*9.4*T.factor)%>% ###RUE is 0.94g/MJ
mutate(Production.sum4B = cumsum(Production.day4B))%>%
mutate(Production.day4C = PARi*9.5*T.factor)%>% ###RUE is 0.95g/MJ
mutate(Production.sum4C = cumsum(Production.day4C))%>%
mutate(Production.day4D = PARi*9.6*T.factor)%>% ###RUE is 0.96g/MJ
mutate(Production.sum4D = cumsum(Production.day4D))%>%
mutate(Production.day5 = PARi*9.7*T.factor)%>% ###RUE is 0.97g/MJ
mutate(Production.sum5 = cumsum(Production.day5))%>%
mutate(Production.day6 = PARi*10.2*T.factor)%>% ###RUE is 1.02g/MJ
mutate(Production.sum6 = cumsum(Production.day6))%>%
mutate(Production.day7 = PARi*10.7*T.factor)%>% ###RUE is 1.07g/MJ
mutate(Production.sum7 = cumsum(Production.day7))%>%
mutate(Production.day7A = PARi*10.8*T.factor)%>% ###RUE is 1.08g/MJ
mutate(Production.sum7A = cumsum(Production.day7A))%>%
mutate(Production.day7B = PARi*10.9*T.factor)%>% ###RUE is 1.09g/MJ
mutate(Production.sum7B = cumsum(Production.day7B))%>%
mutate(Production.day7C = PARi*11.0*T.factor)%>% ###RUE is 1.10g/MJ
mutate(Production.sum7C = cumsum(Production.day7C))%>%
mutate(Production.day7D = PARi*11.1*T.factor)%>% ###RUE is 1.11g/MJ
mutate(Production.sum7D = cumsum(Production.day7D))%>%
mutate(Production.day8 = PARi*11.2*T.factor)%>% ###RUE is 1.12g/MJ
mutate(Production.sum8 = cumsum(Production.day8))%>%
mutate(Production.day8A = PARi*11.3*T.factor)%>% ###RUE is 1.13g/MJ
mutate(Production.sum8A = cumsum(Production.day8A))%>%
mutate(Production.day8B = PARi*11.4*T.factor)%>% ###RUE is 1.14g/MJ
mutate(Production.sum8B = cumsum(Production.day8B))%>%
mutate(Production.day8C = PARi*11.5*T.factor)%>% ###RUE is 1.15g/MJ
mutate(Production.sum8C = cumsum(Production.day8C))%>%
mutate(Production.day8D = PARi*11.6*T.factor)%>% ###RUE is 1.16g/MJ
mutate(Production.sum8D = cumsum(Production.day8D))%>%
mutate(Production.day9 = PARi*11.7*T.factor)%>% ###RUE is 1.17g/MJ
mutate(Production.sum9 = cumsum(Production.day9))%>%
mutate(Production.day9A = PARi*11.8*T.factor)%>% ###RUE is 1.18g/MJ
mutate(Production.sum9A = cumsum(Production.day9A))%>%
mutate(Production.day9B = PARi*11.9*T.factor)%>% ###RUE is 1.19g/MJ
mutate(Production.sum9B = cumsum(Production.day9B))%>%
mutate(Production.day9C = PARi*12.0*T.factor)%>% ###RUE is 1.20g/MJ
mutate(Production.sum9C = cumsum(Production.day9C))%>%
mutate(Production.day9D = PARi*12.1*T.factor)%>% ###RUE is 1.21g/MJ
mutate(Production.sum9D = cumsum(Production.day9D))%>%
mutate(Production.day10 = PARi*12.2*T.factor)%>% ###RUE is 1.22g/MJ
mutate(Production.sum10 = cumsum(Production.day10))%>%
mutate(Production.day11 = PARi*12.7*T.factor)%>% ###RUE is 1.27g/MJ
mutate(Production.sum11 = cumsum(Production.day11))%>%
mutate(Production.day12 = PARi*13.2*T.factor)%>% ###RUE is 1.32g/MJ
mutate(Production.sum12 = cumsum(Production.day12))%>%
mutate(Production.day13 = PARi*13.7*T.factor)%>% ###RUE is 1.37g/MJ
mutate(Production.sum13 = cumsum(Production.day13))%>%
mutate(Potentialroot1 = PARi*1*T.factor)%>%
mutate(Sumpotential1 = cumsum(Potentialroot1))%>% ###RuE root is 0.1g/MJ
mutate(Potentialroot2 = PARi*2*T.factor)%>%
mutate(Sumpotential2 = cumsum(Potentialroot2))%>% ####RUE root is 0.2g/MJ
mutate(Potentialroot3 = PARi*2.4*T.factor)%>%
mutate(Sumpotential3 = cumsum(Potentialroot3))%>% ####RUE root is 0.25g/MJ
mutate(Potentialroot3A = PARi*2.5*T.factor)%>%
mutate(Sumpotential3A = cumsum(Potentialroot3A))%>%
mutate(Potentialroot4 = PARi*3*T.factor)%>%
mutate(Sumpotential4 = cumsum(Potentialroot4))%>% ####RUE root is 0.3g/MJ
mutate(Potentialroot5 = PARi*3.5*T.factor)%>%
mutate(Sumpotential5 = cumsum(Potentialroot5))%>% ####RUE root is 0.35g/MJ
mutate(Potentialroot6 = PARi*4*T.factor)%>%
mutate(Sumpotential6 = cumsum(Potentialroot6))%>% ####RUE root is 0.4g/MJ
mutate(AccPARi=cumsum(PARi))
fPAR.df<- rbind( fPAR.df, fPAR.data)
}
summary(fPAR.df)
year day rain maxt mint mean radn
Min. :2002 Min. : 1.0 Min. : 0.000 Min. : 3.10 Min. :-6.200 Min. : 0.00 Min. : 0.40
1st Qu.:2003 1st Qu.: 91.0 1st Qu.: 0.000 1st Qu.:12.60 1st Qu.: 2.900 1st Qu.: 8.10 1st Qu.: 6.40
Median :2015 Median :183.0 Median : 0.000 Median :16.60 Median : 6.600 Median :11.70 Median :11.47
Mean :2010 Mean :181.7 Mean : 1.526 Mean :17.04 Mean : 6.624 Mean :11.80 Mean :13.56
3rd Qu.:2016 3rd Qu.:268.0 3rd Qu.: 0.400 3rd Qu.:20.80 3rd Qu.:10.300 3rd Qu.:15.25 3rd Qu.:20.20
Max. :2018 Max. :366.0 Max. :65.000 Max. :35.00 Max. :20.000 Max. :25.20 Max. :38.10
wind vp Pp Tbb TTbroken TTfick TTbeta
Min. : 0.000 Min. : 5.40 Min. :10.02 Min. :1 Min. : 0.5401 Min. : 0.6519 Min. : 0.003152
1st Qu.: 2.700 1st Qu.: 8.80 1st Qu.:10.92 1st Qu.:1 1st Qu.: 5.0739 1st Qu.: 6.1236 1st Qu.: 1.063950
Median : 3.700 Median :10.15 Median :12.88 Median :1 Median : 7.7761 Median : 9.2705 Median : 3.024918
Mean : 3.837 Mean :10.55 Mean :13.08 Mean :1 Mean : 8.2006 Mean : 9.4586 Mean : 4.416565
3rd Qu.: 4.800 3rd Qu.:11.90 3rd Qu.:15.20 3rd Qu.:1 3rd Qu.:10.9271 3rd Qu.:12.4425 3rd Qu.: 6.639466
Max. :12.500 Max. :19.90 Max. :16.65 Max. :1 Max. :20.2195 Max. :20.8706 Max. :21.944348
Experiment Water Defoliation SowingDate FD GrowthSeason Rotation StartDate MidDate
Lincoln2002:3334 irr:6836 HH:1173 no:3502 FD5:6836 Gs_1:2036 Rt_1 :1950 14/06/2002: 418 7/08/2004 : 342
Lincoln2003: 0 LL:1976 No:3334 FD6: 0 Gs_2:2359 Rt_3 : 931 12/06/2004: 342 9/08/2003 : 230
Lincoln2015:3502 LS: 804 Gs_3:1376 Rt_2 : 923 13/06/2003: 327 9/08/2002 : 228
SL: 843 Gs_4: 991 Rt_4 : 785 4/09/2015 : 168 2/12/2017 : 184
SS:2040 Gs_5: 74 Rt_6 : 583 17/07/2017: 167 31/05/2018: 163
Rt_5 : 488 19/10/2017: 164 10/06/2017: 125
(Other):1176 (Other) :5250 (Other) :5564
FinishDate ExpName Clock.Today Tt_beta_sum Tt_fick_sum
3/10/2004 : 342 Iversen_91DefoliationSSGs_3Rt_1: 118 Min. :2002-06-14 Min. : 0.2834 Min. : 3.546
5/10/2003 : 230 Iversen_91DefoliationLLGs_2Rt_1: 115 1st Qu.:2003-08-24 1st Qu.: 39.0997 1st Qu.: 116.814
5/10/2002 : 228 Iversen_91DefoliationLSGs_2Rt_1: 115 Median :2015-01-25 Median : 80.1156 Median : 225.262
10/07/2018: 163 Iversen_91DefoliationLLGs_1Rt_1: 114 Mean :2010-05-15 Mean :117.1140 Mean : 269.455
20/04/2018: 138 Iversen_91DefoliationLLGs_3Rt_1: 114 3rd Qu.:2016-11-10 3rd Qu.:145.5871 3rd Qu.: 369.084
11/07/2017: 125 Iversen_91DefoliationLSGs_1Rt_1: 114 Max. :2018-08-24 Max. :829.8554 Max. :1273.027
(Other) :5610 (Other) :6146
Tt_broken_sum Ppm Tmean LAI Franction Tearth ExperimentID TreatmentID
Min. : 2.938 Min. :10.18 Min. : 6.714 Min. :0.000 Min. :0.000 Min. : 1.20 E3:3334 IHHF5:1173
1st Qu.: 99.701 1st Qu.:11.30 1st Qu.: 7.954 1st Qu.:0.000 1st Qu.:0.000 1st Qu.: 7.90 E5:3502 ILL : 843
Median : 193.896 Median :12.65 Median :11.618 Median :0.910 Median :0.522 Median :12.21 ILLF5:1133
Mean : 232.550 Mean :13.08 Mean :11.800 Mean :1.546 Mean :0.486 Mean :12.62 ILS : 804
3rd Qu.: 317.337 3rd Qu.:15.04 3rd Qu.:15.100 3rd Qu.:2.585 3rd Qu.:0.878 3rd Qu.:17.13 ISL : 843
Max. :1139.887 Max. :16.61 Max. :19.460 Max. :7.485 Max. :0.998 Max. :26.76 ISS : 844
NA's :6049 NA's :6049 ISSF5:1196
ID T.factor ExpUnitCode fPAR PARi Production.day0
E3ILL : 843 Min. :0.0000 Iversen_91DefoliationSSGs_3Rt_1: 118 Min. :0.0000 Min. : 0.0000 Min. : 0.000
E3ILS : 804 1st Qu.:0.4500 Iversen_91DefoliationLLGs_2Rt_1: 115 1st Qu.:0.1004 1st Qu.: 0.7003 1st Qu.: 1.896
E3ISL : 843 Median :0.6500 Iversen_91DefoliationLSGs_2Rt_1: 115 Median :0.3876 Median : 3.8392 Median : 16.384
E3ISS : 844 Mean :0.6428 Iversen_91DefoliationLLGs_1Rt_1: 114 Mean :0.4376 Mean : 6.9688 Mean : 38.392
E5IHHF5:1173 3rd Qu.:0.8472 Iversen_91DefoliationLLGs_3Rt_1: 114 3rd Qu.:0.7799 3rd Qu.:11.1173 3rd Qu.: 59.178
E5ILLF5:1133 Max. :1.0000 Iversen_91DefoliationLSGs_1Rt_1: 114 Max. :0.9977 Max. :36.3199 Max. :239.807
E5ISSF5:1196 (Other) :6146
Production.sum0 Production.day1 Production.sum1 Production.day2 Production.sum2 Production.day3
Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.00 Min. : 0.00 Min. : 0.000
1st Qu.: 24.98 1st Qu.: 2.028 1st Qu.: 26.71 1st Qu.: 2.16 1st Qu.: 28.45 1st Qu.: 2.291
Median : 206.49 Median : 17.522 Median : 220.83 Median : 18.66 Median : 235.17 Median : 19.797
Mean : 824.72 Mean : 41.058 Mean : 881.99 Mean : 43.72 Mean : 939.26 Mean : 46.391
3rd Qu.: 998.45 3rd Qu.: 63.288 3rd Qu.: 1067.79 3rd Qu.: 67.40 3rd Qu.: 1137.13 3rd Qu.: 71.507
Max. :11047.53 Max. :256.460 Max. :11814.72 Max. :273.11 Max. :12581.91 Max. :289.766
Production.sum3 Production.day3A Production.sum3A Production.day3B Production.sum3B Production.day3C
Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.00
1st Qu.: 30.18 1st Qu.: 2.318 1st Qu.: 30.53 1st Qu.: 2.344 1st Qu.: 30.88 1st Qu.: 2.37
Median : 249.50 Median : 20.025 Median : 252.37 Median : 20.252 Median : 255.24 Median : 20.48
Mean : 996.53 Mean : 46.924 Mean : 1007.99 Mean : 47.457 Mean : 1019.44 Mean : 47.99
3rd Qu.: 1206.46 3rd Qu.: 72.329 3rd Qu.: 1220.33 3rd Qu.: 73.151 3rd Qu.: 1234.20 3rd Qu.: 73.97
Max. :13349.10 Max. :293.097 Max. :13502.53 Max. :296.428 Max. :13655.97 Max. :299.76
Production.sum3C Production.day3D Production.sum3D Production.day4 Production.sum4 Production.day4A
Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.000
1st Qu.: 31.22 1st Qu.: 2.397 1st Qu.: 31.57 1st Qu.: 2.423 1st Qu.: 31.92 1st Qu.: 2.449
Median : 258.11 Median : 20.707 Median : 260.98 Median : 20.935 Median : 263.84 Median : 21.162
Mean : 1030.90 Mean : 48.524 Mean : 1042.35 Mean : 49.057 Mean : 1053.81 Mean : 49.590
3rd Qu.: 1248.07 3rd Qu.: 74.794 3rd Qu.: 1261.93 3rd Qu.: 75.616 3rd Qu.: 1275.80 3rd Qu.: 76.438
Max. :13809.41 Max. :303.089 Max. :13962.85 Max. :306.420 Max. :14116.28 Max. :309.750
Production.sum4A Production.day4B Production.sum4B Production.day4C Production.sum4C Production.day4D
Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.000
1st Qu.: 32.26 1st Qu.: 2.476 1st Qu.: 32.61 1st Qu.: 2.502 1st Qu.: 32.96 1st Qu.: 2.528
Median : 266.71 Median : 21.390 Median : 269.58 Median : 21.617 Median : 272.45 Median : 21.845
Mean : 1065.26 Mean : 50.123 Mean : 1076.71 Mean : 50.657 Mean : 1088.17 Mean : 51.190
3rd Qu.: 1289.67 3rd Qu.: 77.260 3rd Qu.: 1303.54 3rd Qu.: 78.082 3rd Qu.: 1317.40 3rd Qu.: 78.904
Max. :14269.72 Max. :313.081 Max. :14423.16 Max. :316.412 Max. :14576.60 Max. :319.742
Production.sum4D Production.day5 Production.sum5 Production.day6 Production.sum6 Production.day7
Min. : 0.0 Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.000
1st Qu.: 33.3 1st Qu.: 2.555 1st Qu.: 33.65 1st Qu.: 2.686 1st Qu.: 35.38 1st Qu.: 2.818
Median : 275.3 Median : 22.073 Median : 278.18 Median : 23.210 Median : 292.52 Median : 24.348
Mean : 1099.6 Mean : 51.723 Mean : 1111.08 Mean : 54.389 Mean : 1168.35 Mean : 57.055
3rd Qu.: 1331.3 3rd Qu.: 79.726 3rd Qu.: 1345.14 3rd Qu.: 83.835 3rd Qu.: 1414.47 3rd Qu.: 87.945
Max. :14730.0 Max. :323.073 Max. :14883.48 Max. :339.726 Max. :15650.66 Max. :356.379
Production.sum7 Production.day7A Production.sum7A Production.day7B Production.sum7B Production.day7C
Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.000
1st Qu.: 37.12 1st Qu.: 2.844 1st Qu.: 37.47 1st Qu.: 2.871 1st Qu.: 37.81 1st Qu.: 2.897
Median : 306.86 Median : 24.576 Median : 309.73 Median : 24.803 Median : 312.60 Median : 25.031
Mean : 1225.62 Mean : 57.589 Mean : 1237.08 Mean : 58.122 Mean : 1248.53 Mean : 58.655
3rd Qu.: 1483.81 3rd Qu.: 88.767 3rd Qu.: 1497.68 3rd Qu.: 89.589 3rd Qu.: 1511.55 3rd Qu.: 90.411
Max. :16417.85 Max. :359.710 Max. :16571.29 Max. :363.041 Max. :16724.73 Max. :366.371
Production.sum7C Production.day7D Production.sum7D Production.day8 Production.sum8 Production.day8A Production.sum8A
Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.00 Min. : 0.00 Min. : 0.000 Min. : 0.0
1st Qu.: 38.16 1st Qu.: 2.923 1st Qu.: 38.51 1st Qu.: 2.95 1st Qu.: 38.85 1st Qu.: 2.976 1st Qu.: 39.2
Median : 315.47 Median : 25.258 Median : 318.33 Median : 25.49 Median : 321.20 Median : 25.713 Median : 324.1
Mean : 1259.99 Mean : 59.188 Mean : 1271.44 Mean : 59.72 Mean : 1282.89 Mean : 60.255 Mean : 1294.3
3rd Qu.: 1525.41 3rd Qu.: 91.233 3rd Qu.: 1539.28 3rd Qu.: 92.05 3rd Qu.: 1553.15 3rd Qu.: 92.876 3rd Qu.: 1567.0
Max. :16878.17 Max. :369.702 Max. :17031.60 Max. :373.03 Max. :17185.04 Max. :376.363 Max. :17338.5
Production.day8B Production.sum8B Production.day8C Production.sum8C Production.day8D Production.sum8D Production.day9
Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.0 Min. : 0.000 Min. : 0.00 Min. : 0.000
1st Qu.: 3.002 1st Qu.: 39.55 1st Qu.: 3.029 1st Qu.: 39.9 1st Qu.: 3.055 1st Qu.: 40.24 1st Qu.: 3.081
Median : 25.941 Median : 326.94 Median : 26.169 Median : 329.8 Median : 26.396 Median : 332.67 Median : 26.624
Mean : 60.788 Mean : 1305.80 Mean : 61.321 Mean : 1317.3 Mean : 61.854 Mean : 1328.71 Mean : 62.388
3rd Qu.: 93.698 3rd Qu.: 1580.88 3rd Qu.: 94.520 3rd Qu.: 1594.8 3rd Qu.: 95.342 3rd Qu.: 1608.62 3rd Qu.: 96.164
Max. :379.694 Max. :17491.92 Max. :383.025 Max. :17645.4 Max. :386.355 Max. :17798.79 Max. :389.686
Production.sum9 Production.day9A Production.sum9A Production.day9B Production.sum9B Production.day9C
Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.00
1st Qu.: 40.59 1st Qu.: 3.108 1st Qu.: 40.94 1st Qu.: 3.134 1st Qu.: 41.28 1st Qu.: 3.16
Median : 335.54 Median : 26.851 Median : 338.41 Median : 27.079 Median : 341.28 Median : 27.31
Mean : 1340.17 Mean : 62.921 Mean : 1351.62 Mean : 63.454 Mean : 1363.08 Mean : 63.99
3rd Qu.: 1622.49 3rd Qu.: 96.986 3rd Qu.: 1636.35 3rd Qu.: 97.808 3rd Qu.: 1650.22 3rd Qu.: 98.63
Max. :17952.23 Max. :393.017 Max. :18105.67 Max. :396.347 Max. :18259.11 Max. :399.68
Production.sum9C Production.day9D Production.sum9D Production.day10 Production.sum10 Production.day11
Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.000
1st Qu.: 41.63 1st Qu.: 3.187 1st Qu.: 41.98 1st Qu.: 3.213 1st Qu.: 42.32 1st Qu.: 3.345
Median : 344.14 Median : 27.534 Median : 347.01 Median : 27.761 Median : 349.88 Median : 28.899
Mean : 1374.53 Mean : 64.520 Mean : 1385.98 Mean : 65.054 Mean : 1397.44 Mean : 67.720
3rd Qu.: 1664.09 3rd Qu.: 99.452 3rd Qu.: 1677.96 3rd Qu.:100.274 3rd Qu.: 1691.82 3rd Qu.:104.383
Max. :18412.55 Max. :403.009 Max. :18565.98 Max. :406.339 Max. :18719.42 Max. :422.992
Production.sum11 Production.day12 Production.sum12 Production.day13 Production.sum13 Potentialroot1
Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.0000
1st Qu.: 44.06 1st Qu.: 3.477 1st Qu.: 45.79 1st Qu.: 3.608 1st Qu.: 47.53 1st Qu.: 0.2634
Median : 364.22 Median : 30.037 Median : 378.56 Median : 31.175 Median : 392.90 Median : 2.2755
Mean : 1454.71 Mean : 70.386 Mean : 1511.98 Mean : 73.052 Mean : 1569.26 Mean : 5.3323
3rd Qu.: 1761.16 3rd Qu.:108.493 3rd Qu.: 1830.50 3rd Qu.:112.603 3rd Qu.: 1899.84 3rd Qu.: 8.2192
Max. :19486.61 Max. :439.646 Max. :20253.80 Max. :456.299 Max. :21020.99 Max. :33.3065
Sumpotential1 Potentialroot2 Sumpotential2 Potentialroot3 Sumpotential3 Potentialroot3A
Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000
1st Qu.: 3.469 1st Qu.: 0.5267 1st Qu.: 6.938 1st Qu.: 0.6321 1st Qu.: 8.326 1st Qu.: 0.6584
Median : 28.679 Median : 4.5511 Median : 57.358 Median : 5.4613 Median : 68.829 Median : 5.6888
Mean : 114.544 Mean :10.6645 Mean : 229.088 Mean :12.7974 Mean : 274.906 Mean :13.3307
3rd Qu.: 138.674 3rd Qu.:16.4383 3rd Qu.: 277.348 3rd Qu.:19.7260 3rd Qu.: 332.818 3rd Qu.:20.5479
Max. :1534.379 Max. :66.6130 Max. :3068.758 Max. :79.9356 Max. :3682.509 Max. :83.2662
Sumpotential3A Potentialroot4 Sumpotential4 Potentialroot5 Sumpotential5 Potentialroot6 Sumpotential6
Min. : 0.000 Min. : 0.0000 Min. : 0.00 Min. : 0.0000 Min. : 0.00 Min. : 0.000 Min. : 0.00
1st Qu.: 8.673 1st Qu.: 0.7901 1st Qu.: 10.41 1st Qu.: 0.9218 1st Qu.: 12.14 1st Qu.: 1.053 1st Qu.: 13.88
Median : 71.697 Median : 6.8266 Median : 86.04 Median : 7.9643 Median : 100.38 Median : 9.102 Median : 114.72
Mean : 286.360 Mean :15.9968 Mean : 343.63 Mean : 18.6629 Mean : 400.90 Mean : 21.329 Mean : 458.18
3rd Qu.: 346.685 3rd Qu.:24.6575 3rd Qu.: 416.02 3rd Qu.: 28.7671 3rd Qu.: 485.36 3rd Qu.: 32.877 3rd Qu.: 554.70
Max. :3835.947 Max. :99.9195 Max. :4603.14 Max. :116.5727 Max. :5370.33 Max. :133.226 Max. :6137.52
AccPARi
Min. : 0.000
1st Qu.: 6.559
Median : 49.712
Mean : 153.338
3rd Qu.: 201.712
Max. :1785.400
fPAR.df
write.csv(fPAR.df,"D:/R/fPARoot1.df.csv", row.names = FALSE)
calculated protential yield and remoblisation
merge PARi and observed data
E3ILLS1<-E3ILL%>%
filter(Tbb==1)%>%
filter(Variable=="shootbiomass")%>%
dplyr::select(Clock.Today,ExpName,Interval, VariableUnits,Observed,StdDEV,ExperimentID,TreatmentID,ID,GrowthSeason1,
Rotation1, Clock.Today1,GrowthSeason2,GrowthRotation)%>%
mutate(shootbiomass=Observed,StdDEVS=StdDEV)
E3ILLR1<-E3ILL%>%
filter(Tbb==1)%>%
filter(Variable=="RootWt")%>%
dplyr::select(Clock.Today,ExpName,Observed,StdDEV)%>%
mutate(RootWt=Observed,StdDEVR=StdDEV)
E3ILL1<-merge(E3ILLS1,E3ILLR1,by=c("Clock.Today","ExpName"))%>%
dplyr::select(-Observed.x,-StdDEV.x,-Observed.y, -StdDEV.y)
P.E3ILL<-merge(Tem.factor,E3ILLS1,by=c("Clock.Today","ExpName"))%>%
unique()
write.csv(P.E3ILL,"D:/R/Respiration/P.E3ILL.csv", row.names = FALSE)
plot potentail and shoot biomass
fPAR.df%>%
dplyr::filter(ID=="E3ILL")%>%
ggplot(aes(x=Clock.Today,y=production.sum2))+geom_line(size=1)+theme_bw()+
geom_point(data=E3ILLS1,aes(x=Clock.Today,y=shootbiomass,color="red",size=2))+
##facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
xlab("Date")+ylab("Biomass (kg/ha)")+mytheme3+ theme(legend.title=element_blank(),legend.position = "blank")
Error in FUN(X[[i]], ...) : object 'production.sum2' not found

E3ILSS1<-E3ILS%>%
#filter(Tbb==1)%>%
filter(Variable=="shootbiomass")%>%
dplyr::select(Clock.Today, ExpUnitCode,VariableUnits,Observed,Variable,StdDEV,ExperimentID,ID,GrowthSeason1,
Rotation1, Clock.Today1,GrowthSeason2)%>%
mutate(shootbiomass=Observed,StdDEVS=StdDEV)
P.E3ILS<-merge(fPAR.df,E3ILSS1,by=c("Clock.Today","ExpUnitCode"))
fPAR.df%>%
dplyr::filter(ID=="E3ILS")%>%
ggplot(aes(x=Clock.Today,y=production.sum2))+geom_line(size=1)+theme_bw()+
geom_point(data=E3ILSS1,aes(x=Clock.Today,y=shootbiomass,color="red",size=2))+
#facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
xlab("Date")+ylab("Biomass (kg/ha)")+mytheme3+ theme(legend.title=element_blank(),legend.position = "blank")
Error in FUN(X[[i]], ...) : object 'production.sum2' not found

E3ISLS1<-E3ISL%>%
#filter(Tbb==1)%>%
filter(Variable=="shootbiomass")%>%
dplyr::select(Clock.Today, ExpUnitCode,VariableUnits,Observed,Variable,StdDEV,ExperimentID,ID,GrowthSeason1,
Rotation1, Clock.Today1,GrowthSeason2)%>%
mutate(shootbiomass=Observed,StdDEVS=StdDEV)
P.E3ISL<-merge(fPAR.df,E3ISLS1,by=c("Clock.Today","ExpUnitCode"))
fPAR.df%>%
dplyr::filter(ID=="E3ISL")%>%
ggplot(aes(x=Clock.Today,y=production.sum2))+geom_line(size=1)+theme_bw()+
geom_point(data=E3ISLS1,aes(x=Clock.Today,y=shootbiomass,color="red",size=2))+
#facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
xlab("Date")+ylab("Biomass (kg/ha)")+mytheme3+ theme(legend.title=element_blank(),legend.position = "blank")

#remove grid lines
#ggsave("D:/R/Pictures/C5/Yield//E5ILLF5.png", width=8, height=6, dpi=500)
E3ISSS1<-E3ISS%>%
#filter(Tbb==1)%>%
filter(Variable=="shootbiomass")%>%
dplyr::select(Clock.Today, ExpUnitCode,VariableUnits,Observed,Variable,StdDEV,ExperimentID,ID,GrowthSeason1,
Rotation1, Clock.Today1,GrowthSeason2)%>%
mutate(shootbiomass=Observed,StdDEVS=StdDEV)
P.E3ISS<-merge(fPAR.df,E3ISSS1,by=c("Clock.Today","ExpUnitCode"))
fPAR.df%>%
dplyr::filter(ID=="E3ISS")%>%
ggplot(aes(x=Clock.Today,y=production.sum2))+geom_line(size=1)+theme_bw()+
geom_point(data=E3ISSS1,aes(x=Clock.Today,y=shootbiomass,color="red",size=2))+
#facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
xlab("Date")+ylab("Biomass (kg/ha)")+mytheme3+ theme(legend.title=element_blank(),legend.position = "blank")

write.csv(P.E3ISS,"D:/R/Respiration/P.E3ISS.csv", row.names = FALSE)
#remove grid lines
#ggsave("D:/R/Pictures/C5/Yield//E5ILLF5.png", width=8, height=6, dpi=500)
E5IHHF5S1<-E5IHHFD5%>%
#filter(Tbb==1)%>%
filter(Variable=="shootbiomass")%>%
dplyr::select(Clock.Today, ExpUnitCode,VariableUnits,Observed,Variable,StdDEV,ExperimentID,ID,GrowthSeason1,
Rotation1, Clock.Today1,GrowthSeason2)%>%
mutate(shootbiomass=Observed,StdDEVS=StdDEV)
P.E5IHHF5<-merge(fPAR.df,E5IHHF5S1,by=c("Clock.Today","ExpUnitCode"))
fPAR.df%>%
dplyr::filter(ID=="E5IHHF5")%>%
ggplot(aes(x=Clock.Today,y=production.sum2))+geom_line(size=1)+theme_bw()+
geom_point(data=E5IHHF5S1,aes(x=Clock.Today,y=shootbiomass,color="red",size=2))+
#facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
xlab("Date")+ylab("Biomass (kg/ha)")+mytheme3+ theme(legend.title=element_blank(),legend.position = "blank")

#remove grid lines
#ggsave("D:/R/Pictures/C5/Yield//E5ILLF5.png", width=8, height=6, dpi=500)
E5ISSF5S1<-E5ISSFD5%>%
#filter(Tbb==1)%>%
filter(Variable=="shootbiomass")%>%
dplyr::select(Clock.Today, ExpUnitCode,VariableUnits,Observed,Variable,StdDEV,ExperimentID,ID,GrowthSeason1,
Rotation1, Clock.Today1,GrowthSeason2)%>%
mutate(shootbiomass=Observed,StdDEVS=StdDEV)
P.E5ISSF5S1<-merge(fPAR.df,E5ISSF5S1,by=c("Clock.Today","ExpUnitCode"))
fPAR.df%>%
dplyr::filter(ID=="E5ISSF5")%>%
ggplot(aes(x=Clock.Today,y=production.sum2))+geom_line(size=1)+theme_bw()+
geom_point(data=E5ISSF5S1,aes(x=Clock.Today,y=shootbiomass,color="red",size=2))+
#facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
xlab("Date")+ylab("Biomass (kg/ha)")+mytheme3+ theme(legend.title=element_blank(),legend.position = "blank")

#remove grid lines
#ggsave("D:/R/Pictures/C5/Yield//E5ILLF5.png", width=8, height=6, dpi=500)
E5ILLF5S1<-E5ILLF5%>%
#filter(Tbb==1)%>%
filter(Variable=="shootbiomass")%>%
dplyr::select(Clock.Today, ExpUnitCode,VariableUnits,Observed,Variable,StdDEV,ExperimentID,ID,GrowthSeason1,
Rotation1, Clock.Today1,GrowthSeason2)%>%
mutate(shootbiomass=Observed,StdDEVS=StdDEV)
P.E5ILLF5S1<-merge(fPAR.df,E5ILLF5S1,by=c("Clock.Today","ExpUnitCode"))
fPAR.df%>%
dplyr::filter(ID=="E5ILLF5")%>%
ggplot(aes(x=Clock.Today,y=production.sum2))+geom_line(size=1)+theme_bw()+
geom_point(data=E5ILLF5S1,aes(x=Clock.Today,y=shootbiomass,color="red",size=2))+
#facet_grid(Variable~ID)+ggtitle(paste0("E5ILLF5"))+
xlab("Date")+ylab("Biomass (kg/ha)")+mytheme3+ theme(legend.title=element_blank(),legend.position = "blank")

Load data
analysis of production
upDir <- "D:/R/Respiration/"
obsData <- "D:/R/Respiration/"
Biomass <- read.csv(paste0(obsData, "fPARoot.df.CSV"),
header = TRUE) %>%
mutate(Clock.Today=dmy(Clock.Today))
Biomass.LL<-Biomass%>% ####Root biomass just from respiration 0.03
filter(ID=="E3ILL")%>%
filter(RootRespiration1!="NA")
Biomass.LL%>%
ggplot(aes(x=Clock.Today, y=RootRespiration1))+geom_line(size=1)+theme_bw()+mytheme3+
geom_point(aes(y=RootWt,size=2))+geom_line(aes(y=RootRespiration2))+ggtitle(paste0("E3ILL"))+
xlab("Date")+ylab("Root biomass (kg/ha)")+theme(legend.title=element_blank(),legend.position = "blank")

Root growth Rate calculation
plot potential root biomass aganist accumlated Tt (linear regression analysis)
calculate root growth rate
Biomass1<-Biomass%>%
mutate(PT=Tt_fick_sum/Pp)%>%
mutate(per=Partitioning/production.sum)%>%
filter(ExperimentID=="E3")%>%
filter(Partitioning!="NA")
Biomass1%>%
#filter(ID=="E3ILL")%>%
ggplot(aes(x=Tt_broken_sum, y=Partitioning,color=ID))+geom_point(size=1)+
facet_grid(GrowthSeason~Rotation) + theme_bw()+mytheme3+xlab("Thermal time")+ylab("Potential root storage")

#geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")
#geom_point(aes(y=RootWt,size=2))+geom_line(aes(y=RootRespiration2))
ggsave("D:/R/Pictures/C5/Yield/rootstorage.png", width=8, height=6, dpi=500)
Increasing Pp
RUE testing
BiomassShootE31<-BiomassInc%>%
filter(Variable=="Production.sum9")
BiomassShootE31%>%
ggplot(aes(x=Clock.Today,y=shootbiomass))+geom_line(size=1)+theme_bw()+
facet_wrap(~ID,ncol = 1)+
geom_point(aes(x=Clock.Today, y=Predicted),colour="green",size=3)+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Shoot DM ('*kg~ha^-1*')')))+
mytheme3

BiomassInc %>%
mutate(Observed=shootbiomass)%>%
group_by(Variable) %>%
summarise(
n = n(),
r2 = gauchStats(Predicted,Observed)[5],
# rmse = round(rmse(Predicted,Observed),0),
r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
nse = round(NSE(Predicted,Observed),1),
sb = gauchStats(Predicted,Observed)[1],
nu = gauchStats(Predicted,Observed)[2],
lc = gauchStats(Predicted,Observed)[3]
)
###1=0.72, 0.77, 0.82, 0.87, 0.92, 0.97, 1.02, 1.07, 1.12, (1.17), 1.22, 1.27, 1.32,1.37, 1.42, 1.52, 1.62, 1.72
Dec Pp
BiomassDec <- Biomass %>%
filter(ExperimentID=="E3")%>%
filter(shootbiomass!="NA")%>%
filter(Trend=="Dec")%>%
filter(fPAR!=0)%>%
dplyr::select(ExperimentID,TreatmentID,ID,Clock.Today,Tearth,Trend,Stage,GrowthRotation,shootbiomass,StS,Production.sum0,Production.sum1,Production.sum2,Production.sum3,Production.sum3A,Production.sum3B,Production.sum3C,Production.sum3D,Production.sum4,Production.sum4A,Production.sum4B,Production.sum4C,Production.sum4D,Production.sum5,Production.sum6,Production.sum7,Production.sum7A,Production.sum7B,Production.sum7C,Production.sum7D,Production.sum8,Production.sum8A,Production.sum8B,Production.sum8C,Production.sum8D,Production.sum9,Production.sum9A,Production.sum9B,Production.sum9C,Production.sum9D,Production.sum10,Production.sum11,Production.sum12,Production.sum13) %>%
tidyr::gather("Variable","Predicted",Production.sum3:Production.sum10)
#filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
#filter(Name!="Iversen_121DefoliationHHFDFD5")
BiomassDec $Variable<-factor(BiomassDec$Variable, levels=c("Production.sum0","Production.sum1","Production.sum2","Production.sum3","Production.sum3A","Production.sum3B","Production.sum3C","Production.sum3D","Production.sum4","Production.sum4A","Production.sum4B","Production.sum4C","Production.sum4D","Production.sum5","Production.sum6","Production.sum7","Production.sum7A","Production.sum7B","Production.sum7C","Production.sum7D","Production.sum8","Production.sum8A","Production.sum8B","Production.sum8C","Production.sum8D","Production.sum9","Production.sum9A","Production.sum9B","Production.sum9C","Production.sum9D","Production.sum10","Production.sum11","Production.sum12","Production.sum13"))
BiomassDec%>%
ggplot(aes(x=shootbiomass, y= Predicted, colour= factor(ID))) +
geom_point(size=2)+theme_bw()+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
geom_abline(intercept = 0, slope = 1) +
coord_fixed(ratio = 1)+
ggtitle("Shoot biomass (Dec)")+
facet_wrap(~Variable, ncol = 6)+
theme_bw()+mytheme3+
scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
ylab("Predicted")+xlab("Observed") +theme(legend.title=element_blank(),legend.position = "blank")
ggsave("D:/R/Pictures/C5/Yield/RUEshootDec.png", width=8, height=8, dpi=500)

BiomassShootE32<-BiomassDec%>%
filter(Variable=="Production.sum4A")
BiomassShootE32%>%
ggplot(aes(x=Clock.Today,y=shootbiomass))+geom_line(size=1)+theme_bw()+
facet_wrap(~ID,ncol = 1)+
geom_point(aes(x=Clock.Today, y=Predicted),colour="green",size=3)+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Shoot DM ('*kg~ha^-1*')')))+
mytheme3

Combine increasinf and decreasing shoot biomass
BiomassShootE3<-rbind(BiomassShootE31,BiomassShootE32)
BiomassShootE3%>%
ggplot(aes(x=Clock.Today,y=shootbiomass))+geom_line(size=1)+theme_bw()+
facet_wrap(~ID,ncol = 1)+
geom_point(aes(x=Clock.Today, y=Predicted),colour="green",size=3)+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Shoot DM ('*kg~ha^-1*')')))+
mytheme3
ggsave("D:/R/Pictures/C5/Yield/Shootbiomass.png", width=8, height=8, dpi=500)

stistical measurement
BiomassDec %>%
mutate(Observed=shootbiomass)%>%
group_by(Variable) %>%
summarise(
n = n(),
r2 = gauchStats(Predicted,Observed)[5],
# rmse = round(rmse(Predicted,Observed),0),
r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
nse = round(NSE(Predicted,Observed),1),
sb = gauchStats(Predicted,Observed)[1],
nu = gauchStats(Predicted,Observed)[2],
lc = gauchStats(Predicted,Observed)[3]
)
###1=0.72, 0.77, 0.82, 0.87, 0.92,(0.93), 0.97, 1.02, 1.07, 1.12, 1.17, 1.22, 1.27, 1.32,1.37, 1.42, 1.52, 1.62, 1.72
RUE testing for seedling crop
BiomassInc1 <- Biomass %>%
filter(ExperimentID=="E5")%>%
filter(shootbiomass!="NA")%>%
filter(Trend=="Inc")%>%
filter(fPAR!=0)%>%
filter(Stage!="Seedling")%>%
dplyr::select(ExperimentID,TreatmentID,ID,Clock.Today,Tearth,Trend,Stage,GrowthRotation,shootbiomass,StS,Production.sum0,Production.sum1,Production.sum2,Production.sum3,Production.sum3A,Production.sum3B,Production.sum3C,Production.sum3D,Production.sum4,Production.sum4A,Production.sum4B,Production.sum4C,Production.sum4D,Production.sum5,Production.sum6,Production.sum7,Production.sum7A,Production.sum7B,Production.sum7C,Production.sum7D,Production.sum8,Production.sum8A,Production.sum8B,Production.sum8C,Production.sum8D,Production.sum9,Production.sum9A,Production.sum9B,Production.sum9C,Production.sum9D,Production.sum10,Production.sum11,Production.sum12,Production.sum13) %>%
tidyr::gather("Variable","Predicted",Production.sum3:Production.sum10)
#filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
#filter(Name!="Iversen_121DefoliationHHFDFD5")
BiomassInc1 $Variable<-factor(BiomassInc1$Variable, levels=c("Production.sum0","Production.sum1","Production.sum2","Production.sum3","Production.sum3A","Production.sum3B","Production.sum3C","Production.sum3D","Production.sum4","Production.sum4A","Production.sum4B","Production.sum4C","Production.sum4D","Production.sum5","Production.sum6","Production.sum7","Production.sum7A","Production.sum7B","Production.sum7C","Production.sum7D","Production.sum8","Production.sum8A","Production.sum8B","Production.sum8C","Production.sum8D","Production.sum9","Production.sum9A","Production.sum9B","Production.sum9C","Production.sum9D","Production.sum10","Production.sum11","Production.sum12","Production.sum13"))
BiomassInc1%>%
ggplot(aes(x=shootbiomass, y= Predicted, colour= factor(ID))) +
geom_point(size=2)+theme_bw()+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
geom_abline(intercept = 0, slope = 1) +
coord_fixed(ratio = 1)+
ggtitle("Shoot biomass (Inc)")+
facet_wrap(~Variable, ncol = 6)+
theme_bw()+mytheme3+
scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
ylab("Predicted")+xlab("Observed") +
theme(legend.title=element_blank(),legend.position = "blank")
ggsave("D:/R/Pictures/C5/Yield/RUEshootIncE5.png", width=8, height=8, dpi=500)

shoot inc
BiomassShootE51<-BiomassInc1%>%
filter(Variable=="Production.sum9")
BiomassShootE51%>%
ggplot(aes(x=Clock.Today,y=shootbiomass))+geom_line(size=1)+theme_bw()+
facet_wrap(~ID,ncol = 1)+
geom_point(aes(x=Clock.Today, y=Predicted),colour="green",size=3)+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Shoot DM ('*kg~ha^-1*')')))+
mytheme3

BiomassInc1 %>%
mutate(Observed=shootbiomass)%>%
#filter(Name!="Iversen_121DefoliationHHFDFD5")%>%
group_by(Variable) %>%
summarise(
n = n(),
r2 = gauchStats(Predicted,Observed)[5],
# rmse = round(rmse(Predicted,Observed),0),
r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
nse = round(NSE(Predicted,Observed),1),
sb = gauchStats(Predicted,Observed)[1],
nu = gauchStats(Predicted,Observed)[2],
lc = gauchStats(Predicted,Observed)[3]
)
###1=0.72, 0.77, 0.82, 0.87, 0.92, 0.97, 1.02, 1.07, 1.12, 1.17, 1.22, 1.27, 1.32,1.37, 1.42, 1.52, 1.62, 1.72
RUE testing for regrowth crop
BiomassDec1 <- Biomass %>%
filter(ExperimentID=="E5")%>%
filter(shootbiomass!="NA")%>%
filter(Trend=="Dec")%>%
filter(fPAR!=0)%>%
filter(Stage!="Seedling")%>%
dplyr::select(ExperimentID,TreatmentID,ID,Clock.Today,Tearth,Trend,Stage,GrowthRotation,shootbiomass,StS,Production.sum0,Production.sum1,Production.sum2,Production.sum3,Production.sum3A,Production.sum3B,Production.sum3C,Production.sum3D,Production.sum4,Production.sum4A,Production.sum4B,Production.sum4C,Production.sum4D,Production.sum5,Production.sum6,Production.sum7,Production.sum7A,Production.sum7B,Production.sum7C,Production.sum7D,Production.sum8,Production.sum8A,Production.sum8B,Production.sum8C,Production.sum8D,Production.sum9,Production.sum9A,Production.sum9B,Production.sum9C,Production.sum9D,Production.sum10,Production.sum11,Production.sum12,Production.sum13) %>%
tidyr::gather("Variable","Predicted",Production.sum3:Production.sum10)
#filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
#filter(Name!="Iversen_121DefoliationHHFDFD5")
BiomassDec1 $Variable<-factor(BiomassDec1$Variable, levels=c("Production.sum0","Production.sum1","Production.sum2","Production.sum3","Production.sum3A","Production.sum3B","Production.sum3C","Production.sum3D","Production.sum4","Production.sum4A","Production.sum4B","Production.sum4C","Production.sum4D","Production.sum5","Production.sum6","Production.sum7","Production.sum7A","Production.sum7B","Production.sum7C","Production.sum7D","Production.sum8","Production.sum8A","Production.sum8B","Production.sum8C","Production.sum8D","Production.sum9","Production.sum9A","Production.sum9B","Production.sum9C","Production.sum9D","Production.sum10","Production.sum11","Production.sum12","Production.sum13"))
BiomassDec1%>%
ggplot(aes(x=shootbiomass, y= Predicted, colour= factor(ID))) +
geom_point(size=2)+theme_bw()+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
geom_abline(intercept = 0, slope = 1) +
coord_fixed(ratio = 1)+
ggtitle("Shoot biomass (Dec)")+
facet_wrap(~Variable, ncol = 6)+
theme_bw()+mytheme3+
scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
ylab("Predicted")+xlab("Observed")+
theme(legend.title=element_blank(),legend.position = "blank")
ggsave("D:/R/Pictures/C5/Yield/RUEshootDecE5.png", width=8, height=8, dpi=500)

shoot Dec
BiomassShootE52<-BiomassDec1%>%
filter(Variable=="Production.sum4A")
BiomassShootE52%>%
ggplot(aes(x=Clock.Today,y=shootbiomass))+geom_line(size=1)+theme_bw()+
facet_wrap(~ID,ncol = 1)+
geom_point(aes(x=Clock.Today, y=Predicted),colour="green",size=3)+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Shoot DM ('*kg~ha^-1*')')))+
mytheme3

Combine increasinf and decreasing shoot biomass
BiomassShootE5<-rbind(BiomassShootE51,BiomassShootE52)
BiomassShootE5%>%
ggplot(aes(x=Clock.Today,y=shootbiomass))+geom_line(size=1)+theme_bw()+
facet_wrap(~ID,ncol = 1)+
geom_point(aes(x=Clock.Today, y=Predicted),colour="green",size=3)+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Shoot DM ('*kg~ha^-1*')')))+
mytheme3
ggsave("D:/R/Pictures/C5/Yield/ShootbiomassE5.png", width=8, height=8, dpi=500)

BiomassDec1 %>%
mutate(Observed=shootbiomass)%>%
#filter(Name!="Iversen_121DefoliationHHFDFD5")%>%
group_by(Variable) %>%
summarise(
n = n(),
r2 = gauchStats(Predicted,Observed)[5],
# rmse = round(rmse(Predicted,Observed),0),
r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
nse = round(NSE(Predicted,Observed),1),
sb = gauchStats(Predicted,Observed)[1],
nu = gauchStats(Predicted,Observed)[2],
lc = gauchStats(Predicted,Observed)[3]
)
###1=0.82,0.92, 1.02, 1.12, 1.22, 1.32, 1.42, 1.52,1.62, 1.72
RUE testing for seedling crop
BiomassSeedling <- Biomass %>%
filter(ExperimentID=="E5")%>%
filter(shootbiomass!="NA")%>%
#filter(Trend=="Dec")%>%
filter(fPAR!=0)%>%
filter(Stage=="Seedling")%>%
dplyr::select(ExperimentID,TreatmentID,ID,Clock.Today,Tearth,Trend,Stage,GrowthRotation,shootbiomass,StS,Production.sum0,Production.sum1,Production.sum2,Production.sum3,Production.sum3A,Production.sum3B,Production.sum3C,Production.sum3D,Production.sum4,Production.sum4A,Production.sum4B,Production.sum4C,Production.sum4D,Production.sum5,Production.sum6,Production.sum7) %>%
tidyr::gather("Variable","Predicted",Production.sum0:Production.sum7)
#filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
#filter(Name!="Iversen_121DefoliationHHFDFD5")
BiomassSeedling $Variable<-factor(BiomassSeedling$Variable, levels=c("Production.sum0","Production.sum1","Production.sum2","Production.sum3","Production.sum3A","Production.sum3B","Production.sum3C","Production.sum3D","Production.sum4","Production.sum4A","Production.sum4B","Production.sum4C","Production.sum4D","Production.sum5","Production.sum6","Production.sum7","Production.sum7A","Production.sum7B","Production.sum7C","Production.sum7D","Production.sum8","Production.sum8A","Production.sum8B","Production.sum8C","Production.sum8D","Production.sum9","Production.sum9A","Production.sum9B","Production.sum9C","Production.sum9D","Production.sum10","Production.sum11","Production.sum12","Production.sum13"))
BiomassSeedling%>%
ggplot(aes(x=shootbiomass, y= Predicted, colour= factor(ID))) +
geom_point(size=2)+theme_bw()+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
geom_abline(intercept = 0, slope = 1) +
coord_fixed(ratio = 1)+
ggtitle("Shoot biomass (Seedling)")+
facet_wrap(~Variable, ncol = 6)+
theme_bw()+mytheme3+
scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
ylab("Predicted")+xlab("Observed") +
theme(legend.title=element_blank(),legend.position = "blank")
ggsave("D:/R/Pictures/C5/Yield/RUESeedling.png", width=8, height=8, dpi=500)

BiomassSeedling %>%
mutate(Observed=shootbiomass)%>%
#filter(Name!="Iversen_121DefoliationHHFDFD5")%>%
group_by(Variable) %>%
summarise(
n = n(),
r2 = gauchStats(Predicted,Observed)[5],
# rmse = round(rmse(Predicted,Observed),0),
r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
nse = round(NSE(Predicted,Observed),1),
sb = gauchStats(Predicted,Observed)[1],
nu = gauchStats(Predicted,Observed)[2],
lc = gauchStats(Predicted,Observed)[3]
)
###1=0.82,0.92, 1.02, 1.12, 1.22, 1.32, 1.42, 1.52,1.62, 1.72
Root predicted for E3
BiomassRoot <- Biomass %>%
filter(ExperimentID=="E3")%>%
filter(RootWt!="NA")%>%
#filter(Stage!="Seedling")%>%
dplyr::select(ExperimentID,TreatmentID,ID,Clock.Today,Tearth,Trend, Stage,GrowthRotation,RootWt,StS,TotalBiomass,Proot.0.045., Proot1.0.03.,Proot2.0.01.,Proot3.0.005.,Proot4.0.003.,Proot5.0.002.,Proot6.0.0005.,Proot7.0.0005.,Proot8.0.2.,Proot9.0.25.) %>%
tidyr::gather("Variable","Predicted",Proot.0.045.:Proot9.0.25.)
#filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
#filter(Name!="Iversen_121DefoliationHHFDFD5")
BiomassRoot $Variable<-factor(BiomassRoot$Variable, levels=c("Proot.0.045.", "Proot1.0.03.","Proot2.0.01.","Proot3.0.005.","Proot4.0.003.","Proot5.0.002.","Proot6.0.0005.","Proot7.0.0005.","Proot8.0.2.","Proot9.0.25."))
BiomassRoot%>%
ggplot(aes(x=RootWt, y= Predicted, colour= factor(ID))) +
geom_point(size=2)+theme_bw()+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
geom_abline(intercept = 0, slope = 1) +
coord_fixed(ratio = 1)+
ggtitle("Root biomass (E3)")+
facet_wrap(~Variable, ncol = 4)+
theme_bw()+mytheme3+
scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
ylab("Predicted")+xlab("Observed") +
theme(legend.title=element_blank(),legend.position = "blank")
ggsave("D:/R/Pictures/C5/Yield/RootWtE3.png", width=8, height=8, dpi=500)

BiomassRoot %>%
mutate(Observed=RootWt)%>%
#filter(Name!="Iversen_121DefoliationHHFDFD5")%>%
group_by(Variable) %>%
summarise(
n = n(),
r2 = gauchStats(Predicted,Observed)[5],
# rmse = round(rmse(Predicted,Observed),0),
r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
nse = round(NSE(Predicted,Observed),1),
sb = gauchStats(Predicted,Observed)[1],
nu = gauchStats(Predicted,Observed)[2],
lc = gauchStats(Predicted,Observed)[3]
)
###1=0.82,0.92, 1.02, 1.12, 1.22, 1.32, 1.42, 1.52,1.62, 1.72
BiomassRoot%>%
filter(ExperimentID=="E3")%>%
filter(RootWt!="NA")%>%
filter(Variable=="Proot9.0.25.")%>%
ggplot(aes(x=Clock.Today,y=Predicted))+geom_line(size=1)+theme_bw()+
facet_wrap(~ID,ncol = 2)+
geom_point(aes(x=Clock.Today, y=RootWt),colour="green",size=3)+mytheme3+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Root DM ('*kg~ha^-1*')')))
ggsave("D:/R/Pictures/C5/Yield/RootWtpredictedE3.png", width=8, height=6, dpi=500)

Root predicted for E5
BiomassRoot1 <- Biomass %>%
filter(ExperimentID=="E5")%>%
filter(RootWt!="NA")%>%
#filter(Stage!="Seedling")%>%
dplyr::select(ExperimentID,TreatmentID,ID,Clock.Today,Tearth,Trend, Stage,GrowthRotation,RootWt,StS,TotalBiomass,Proot.0.045., Proot1.0.03.,Proot2.0.01.,Proot3.0.005.,Proot4.0.003.,Proot5.0.002.,Proot6.0.0005.,Proot7.0.0005.,Proot8.0.2.,Proot9.0.25.) %>%
tidyr::gather("Variable","Predicted",Proot.0.045.:Proot9.0.25.)
#filter(Name!="Iversen_91DefoliationLL"|GrowthRotation!="31")
#filter(Name!="Iversen_121DefoliationHHFDFD5")
BiomassRoot $Variable<-factor(BiomassRoot$Variable, levels=c("Proot.0.045.", "Proot1.0.03.","Proot2.0.01.","Proot3.0.005.","Proot4.0.003.","Proot5.0.002.","Proot6.0.0005.","Proot7.0.0005.","Proot8.0.2.","Proot9.0.25."))
BiomassRoot1%>%
ggplot(aes(x=RootWt, y= Predicted, colour= factor(ID))) +
geom_point(size=2)+theme_bw()+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey") +
geom_abline(intercept = 0, slope = 1) +
coord_fixed(ratio = 1)+
ggtitle("Root biomass (E5)")+
facet_wrap(~Variable, ncol = 4)+
theme_bw()+mytheme3+
scale_x_continuous(breaks = seq(2000,8000, by =3000), limits=c(0,8000))+
scale_y_continuous(breaks = seq(2000, 6000, by =2000), limits=c(0,8000))+
ylab("Predicted")+xlab("Observed") +
theme(legend.title=element_blank(),legend.position = "blank")
ggsave("D:/R/Pictures/C5/Yield/RootWtE5.png", width=8, height=6, dpi=500)

BiomassRoot1 %>%
mutate(Observed=RootWt)%>%
#filter(Name!="Iversen_121DefoliationHHFDFD5")%>%
group_by(Variable) %>%
summarise(
n = n(),
r2 = gauchStats(Predicted,Observed)[5],
# rmse = round(rmse(Predicted,Observed),0),
r_rmse = round(rmse(Predicted,Observed)/mean(Observed)*100,1),
nse = round(NSE(Predicted,Observed),1),
sb = gauchStats(Predicted,Observed)[1],
nu = gauchStats(Predicted,Observed)[2],
lc = gauchStats(Predicted,Observed)[3]
)
###1=0.82,0.92, 1.02, 1.12, 1.22, 1.32, 1.42, 1.52,1.62, 1.72
BiomassRoot1%>%
filter(ExperimentID=="E5")%>%
filter(RootWt!="NA")%>%
filter(Variable=="Proot9.0.25.")%>%
ggplot(aes(x=Clock.Today,y=Predicted))+geom_line(size=1)+theme_bw()+
facet_wrap(~ID,ncol = 2)+
geom_point(aes(x=Clock.Today, y=RootWt),colour="green",size=3)+mytheme3+
theme(legend.title=element_blank(),legend.position = "blank")+xlab("Date")+ylab(bquote(bold('Root DM ('*kg~ha^-1*')')))
ggsave("D:/R/Pictures/C5/Yield/RootWtpredictedE5.png", width=8, height=6, dpi=500)

average of partitioning rate
average of cutting treatment
Biomass2<-Biomass%>%
filter(Partitioning!="NA")%>%
group_by(GrowthSeason,Rotation,GrowthRotation,Tmean,Ppm,Stage,Trend,ID,ExperimentID) %>%
do(mod1 = lm(Storage2~Tt_broken_sum,data=.)) %>%
mutate(PRate1 = summary(mod1)$coeff[2]) %>%
dplyr::select(-mod1)
Error in eval(predvars, data, env) : object 'Storage2' not found
Root growth rate for dividual experiment
Biomass3<-Biomass%>%
filter(ID=="E5ILLF5")%>%
filter(Partitioning!="NA")%>%
mutate(Part.Rate=Partitioning/Tt_broken_sum)%>%
filter(Part.Rate>0)%>%
ggplot(aes(x=Tt_broken_sum, y=Part.Rate,color=ID))+geom_point(size=1)+
facet_grid(GrowthSeason~Rotation) + theme_bw()+mytheme3+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="darkgrey")
#geom_point(aes(y=RootWt,size=2))+geom_line(aes(y=RootRespiration2)
interceptulate partioning rate
good effort but No!!!!!!
###fPAR interpolate for each rotation
# UniExp <- unique(Biomass.LL$ExpName)
#
# Biomass.LL.df <- data.frame()
#
# for(i in 1:length(UniExp))
# {
#
# Biomass.LL.ex<-Biomass.LL %>%
# mutate(PPR=approx(Clock.Today,PartitioningRate2, xout =Clock.Today,
# method="linear",
# rule = 2)$y) ##interpolate function
# Biomass.LL.df<- rbind( Biomass.LL.ex, Biomass.LL.df)
#
# }
#
# Biomass.LL.df
# write.csv(Biomass.LL.df ,"D:/R/Respiration/Biomass.LL.df .csv", row.names = FALSE)
Calculated RUE
RUET<-Biomass%>%
filter(RootWt!="NA")%>%
filter(TotalBiomass!="NA")
RUEE3<-RUET%>%
filter(ExperimentID=="E5")%>%
mutate(RootWt=RootWt/0.8)%>%
mutate(TotalBiomass=RootWt+shootbiomass)%>%
mutate(TotalBiomass1=TotalBiomass*0.1)
RUE5<-RUET%>%
filter(ExperimentID=="E3")%>%
mutate(TotalBiomass1=TotalBiomass*0.1)
RUE<-rbind(RUEE3,RUE5)
RUE%>%
filter(ID=="E3ILL")%>%
ggplot(aes(x=AccPARi,y=TotalBiomass1))+geom_point(size=2)+theme_bw()+
xlab(bquote(bold('Accumulated PARi ('*MJ~m^-2*')')))+ylab(bquote(bold('Total DM ('*g~DM~m^-2*')')))+
ggtitle("E3ILL") +
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
facet_grid(GrowthSeason~Rotation)+mytheme3+
scale_y_continuous(breaks = seq(0, 1600, by =600), limits=c(0,1600))+
scale_x_continuous(breaks = seq(200, 800, by =400), limits=c(0,800))
RUE%>%
filter(ID=="E3ILS")%>%
ggplot(aes(x=AccPARi,y=TotalBiomass1))+geom_point(size=2)+theme_bw()+
xlab(bquote(bold('Accumulated PARi ('*MJ~m^-2*')')))+ylab(bquote(bold('Total DM ('*g~DM~m^-2*')')))+
ggtitle("E3ILS") +
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
facet_grid(GrowthSeason~Rotation)+mytheme3+
scale_y_continuous(breaks = seq(0, 1600, by =600), limits=c(0,1600))+
scale_x_continuous(breaks = seq(200, 800, by =400), limits=c(0,800))
RUE%>%
filter(ID=="E3ISL")%>%
ggplot(aes(x=AccPARi,y=TotalBiomass1))+geom_point(size=2)+theme_bw()+
xlab(bquote(bold('Accumulated PARi ('*MJ~m^-2*')')))+ylab(bquote(bold('Total DM ('*g~DM~m^-2*')')))+
ggtitle("E3ISL") +
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
facet_grid(GrowthSeason~Rotation)+mytheme3+
scale_y_continuous(breaks = seq(0, 1600, by =600), limits=c(0,1600))+
scale_x_continuous(breaks = seq(200, 800, by =400), limits=c(0,800))
RUE%>%
filter(ID=="E3ISS")%>%
ggplot(aes(x=AccPARi,y=TotalBiomass1))+geom_point(size=2)+theme_bw()+
xlab(bquote(bold('Accumulated PARi ('*MJ~m^-2*')')))+ylab(bquote(bold('Total DM ('*g~DM~m^-2*')')))+
ggtitle("E3ISS") +
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
facet_grid(GrowthSeason~Rotation)+mytheme3+
scale_y_continuous(breaks = seq(0, 800, by =300), limits=c(0,800))+
scale_x_continuous(breaks = seq(200, 800, by =400), limits=c(0,800))
RUE%>%
filter(ID=="E5IHHF5")%>%
ggplot(aes(x=AccPARi,y=TotalBiomass1))+geom_point(size=2)+theme_bw()+
xlab(bquote(bold('Accumulated PARi ('*MJ~m^-2*')')))+ylab(bquote(bold('Total DM ('*g~DM~m^-2*')')))+
ggtitle("E5IHHF5") +
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
facet_grid(GrowthSeason~Rotation)+mytheme3+
scale_y_continuous(breaks = seq(0, 1600, by =600), limits=c(0,1600))+
scale_x_continuous(breaks = seq(200, 800, by =400), limits=c(0,800))
RUE%>%
filter(ID=="E5ILLF5")%>%
ggplot(aes(x=AccPARi,y=TotalBiomass1))+geom_point(size=2)+theme_bw()+
xlab(bquote(bold('Accumulated PARi ('*MJ~m^-2*')')))+ylab(bquote(bold('Total DM ('*g~DM~m^-2*')')))+
ggtitle("E5ILLF5") +
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
facet_grid(GrowthSeason~Rotation)+mytheme3+
scale_y_continuous(breaks = seq(0, 1600, by =600), limits=c(0,1600))+
scale_x_continuous(breaks = seq(200, 800, by =400), limits=c(0,800))
RUE%>%
filter(ID=="E5ISSF5")%>%
ggplot(aes(x=AccPARi,y=TotalBiomass1))+geom_point(size=2)+theme_bw()+
xlab(bquote(bold('Accumulated PARi ('*MJ~m^-2*')')))+ylab(bquote(bold('Total DM ('*g~DM~m^-2*')')))+
ggtitle("E5ISSF5") +
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
facet_grid(GrowthSeason~Rotation)+mytheme3+
scale_y_continuous(breaks = seq(0, 1600, by =600), limits=c(0,1600))+
scale_x_continuous(breaks = seq(200, 800, by =400), limits=c(0,800))
RUE
RUETotal<-RUE%>%
group_by(ExpName,GrowthSeason,Rotation,GrowthRotation,Tmean,Ppm,Stage,Trend,ID,ExperimentID,Defoliation) %>%
do(mod = lm(TotalBiomass1~AccPARi,data=.)) %>%
mutate(RUEt = summary(mod)$coeff[2]) %>%
dplyr::select(-mod)
RUETotal$Trend<- factor(RUETotal$Trend, levels=c("Inc","Dec"))
RUETotal1<-RUETotal%>%
dplyr::filter(RUEt>0)%>%
dplyr::filter(RUEt<2)%>%
filter(Defoliation=="LL")%>%
dplyr::filter(ExpName!="Iversen_91DefoliationLLGs_2Rt_6")%>%
dplyr::filter(ExpName!="Iversen_91DefoliationLLGs_2Rt_7")%>%
dplyr::filter(ExpName!="Iversen_121DefoliationLLFDFD5Gs_4Rt_2")
library(plyr)
lm_eqn2 <- function(RUETotal1){
m <- lm(RUEt~Tmean ,RUETotal1);
eq <- substitute(italic(y) == Tmean +RUEt %.% italic(RUEt)*","~~italic(R)^2~"="~r2,
list(Tmean = format(coef(m)[1], digits = 2),
RUEt= format(coef(m)[2], digits = 2),
r2 = format(summary(m)$r.squared, digits = 3)))
as.character(as.expression(eq));
}
eqsRUE <- ddply(RUETotal1,.(Stage,Trend),lm_eqn2)
RUETotal1%>%
filter(Defoliation=="LL")%>%
ggplot(aes(x=Tmean,y=RUEt,colour=ID,label=GrowthRotation))+geom_text()+theme_bw()+
xlab('Mean temperature (°C)')+ylab(bquote(bold('RUE ('*g~MJ^-1*')')))+
ggtitle("E5ISSF5") +
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")+
#facet_grid(Stage~Trend)+
facet_grid(Trend~Stage)+
mytheme3+
scale_x_continuous(breaks = seq(10, 18, by =3), limits=c(10,18))+
scale_y_continuous(breaks = seq(0, 2, by =1), limits=c(0,2))+
geom_text(data = eqsRUE, aes(x =13.5, y = 2, label = V1),
color = 'black', parse = TRUE, size=4)
ggsave("D:/R/Pictures/C5/Yield/RUE.png", width=8, height=4, dpi=500)
detach(package:plyr)
predicted Vs observed for partitiong
Biomass.LL%>%
ggplot(aes(x=Clock.Today, y=RootP1))+geom_line(size=1)+theme_bw()+mytheme3+
geom_point(aes(y=RootWt))+geom_line(aes(y=RootP2))+geom_line(aes(y=RootP3))+geom_line(aes(y=RootP4))+geom_line(aes(y=RootP5))+geom_line(aes(y=RootP6))+geom_line(aes(y=RootP7))+geom_line(aes(y=RootP8))+geom_line(aes(y=RootP9))+geom_line(aes(y=RootP10))+geom_line(aes(y=RootPA))+xlab("Date")+
ylab("Root biomass (kg/ha)")
ggsave("D:/R/Pictures/C5/Yield/RootGrowthE3ILL.png", width=8, height=4, dpi=500)
Root partitioning rate analysis
Biomass$Trend<-factor(Biomass$Trend, levels=c("Inc", "Dec"))
Biomass%>%
filter(RootRespiration1!="NA")%>%
filter(PartitioningRer1>0)%>%
filter(ExperimentID=="E3")%>%
mutate(Rotation=as.factor(Rotation),GrowthSeason=as.factor(GrowthSeason))%>% ####Root biomass just from respiration 0.03
ggplot(aes(x=Pp, y=PartitioningRer1))+geom_point(size=1)+theme_bw()+mytheme3+
facet_grid(ID~Trend)+xlab("Photoperiod (h)")+
ylab("Proot")+
#scale_x_continuous(breaks = seq(10, 17, by =2), limits=c(10,17))+
#scale_y_continuous(breaks = seq(0, 0.5, by =0.5), limits=c(0,0.5))+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")
ggsave("D:/R/Pictures/C5/Yield/E3.Proot.png", width=8, height=6, dpi=500)
Root partitioning rate analysis
Biomass$Trend<-factor(Biomass$Trend, levels=c("Inc", "Dec"))
Biomass%>%
filter(RootRespiration1!="NA")%>%
filter(PartitioningRer1>0)%>%
filter(ExperimentID=="E5")%>%
mutate(Rotation=as.factor(Rotation),GrowthSeason=as.factor(GrowthSeason))%>% ####Root biomass just from respiration 0.03
ggplot(aes(x=Pp, y=PartitioningRer1))+geom_point(size=1)+theme_bw()+mytheme3+
facet_grid(ID~Trend)+xlab("Photoperiod (h)")+
ylab("Proot")+
#scale_x_continuous(breaks = seq(10, 17, by =2), limits=c(10,17))+
#scale_y_continuous(breaks = seq(0, 0.5, by =0.5), limits=c(0,0.5))+
geom_smooth(method = "lm", se = TRUE, linetype = 1, colour="blue")
ggsave("D:/R/Pictures/C5/Yield/E5.Proot.png", width=8, height=6, dpi=500)
LS Root analysis
Biomass.LS<-Biomass%>%
filter(ID=="E3ILS")%>%
filter(RootRespiration1!="NA")
Biomass.LS%>%
ggplot(aes(x=Clock.Today, y=RootRespiration1))+geom_line(size=1)+theme_bw()+mytheme3+
geom_point(aes(y=RootWt,size=2))+geom_line(aes(y=RootRespiration2))+ggtitle(paste0("E3ILS"))+
xlab("Date")+ylab("Root biomass (kg/ha)")+theme(legend.title=element_blank(),legend.position = "blank")
predicted Vs observed for partitiong
Biomass.LS%>%
ggplot(aes(x=Clock.Today, y=RootP1))+geom_line(size=1)+theme_bw()+mytheme3+
geom_point(aes(y=RootWt))+geom_line(aes(y=RootP2))+geom_line(aes(y=RootP3))+geom_line(aes(y=RootP4))+geom_line(aes(y=RootP5))+geom_line(aes(y=RootP6))+geom_line(aes(y=RootP7))+geom_line(aes(y=RootP8))+geom_line(aes(y=RootP9))+geom_line(aes(y=RootP10))+xlab("Date")+
ylab("Root biomass (kg/ha)")
ggsave("D:/R/Pictures/C5/Yield/RootGrowthE3ILS.png", width=8, height=4, dpi=500)
SL root analysis
Biomass.SL<-Biomass%>%
filter(ID=="E3ISL")%>%
filter(RootRespiration1!="NA")
Biomass.SL%>%
ggplot(aes(x=Clock.Today, y=RootRespiration1))+geom_line(size=1)+theme_bw()+mytheme3+
geom_point(aes(y=RootWt,size=2))+geom_line(aes(y=RootRespiration2))+ggtitle(paste0("E3ISL"))+
xlab("Date")+ylab("Root biomass (kg/ha)")+theme(legend.title=element_blank(),legend.position = "blank")
predicted vs observed in SL
Biomass.SL%>%
ggplot(aes(x=Clock.Today, y=RootP1))+geom_line(size=1)+theme_bw()+mytheme3+
geom_point(aes(y=RootWt))+geom_line(aes(y=RootP2))+geom_line(aes(y=RootP3))+geom_line(aes(y=RootP4))+geom_line(aes(y=RootP5))+geom_line(aes(y=RootP6))+geom_line(aes(y=RootP7))+geom_line(aes(y=RootP8))+geom_line(aes(y=RootP9))+geom_line(aes(y=RootP10))+geom_line(aes(y=RootPA))+xlab("Date")+
ylab("Root biomass (kg/ha)")
ggsave("D:/R/Pictures/C5/Yield/RootGrowthE3ISL.png", width=8, height=4, dpi=500)
SS root analysis
Biomass.SS<-Biomass%>%
filter(ID=="E3ISS")%>%
filter(RootRespiration1!="NA")
Biomass.SS%>%
ggplot(aes(x=Clock.Today, y=RootRespiration1))+geom_line(size=1)+theme_bw()+mytheme3+
geom_point(aes(y=RootWt,size=2))+geom_line(aes(y=RootRespiration2))+ggtitle(paste0("E3ISS"))+
xlab("Date")+ylab("Root biomass (kg/ha)")+theme(legend.title=element_blank(),legend.position = "blank")

predicted vs obsserved
Biomass.SS%>%
ggplot(aes(x=Clock.Today, y=RootP1))+geom_line(size=1)+theme_bw()+mytheme3+
geom_point(aes(y=RootWt))+geom_line(aes(y=RootP2))+geom_line(aes(y=RootP3))+geom_line(aes(y=RootP4))+geom_line(aes(y=RootP5))+geom_line(aes(y=RootP6))+geom_line(aes(y=RootP7))+geom_line(aes(y=RootP8))+geom_line(aes(y=RootP9))+geom_line(aes(y=RootP10))+geom_line(aes(y=RootPA))+xlab("Date")+
ylab("Root biomass (kg/ha)")
ggsave("D:/R/Pictures/C5/Yield/RootGrowthE3ISS.png", width=8, height=4, dpi=500)
E5LLF5
Biomass.LLF5<-Biomass%>%
filter(ID=="E5ILLF5")%>%
filter(RootRespiration1!="NA")
Biomass.LLF5%>%
ggplot(aes(x=Clock.Today, y=RootRespiration1))+geom_line(size=1)+theme_bw()+mytheme3+
geom_point(aes(y=RootWt,size=2,color="blue"))

predicted vs obsserved
Biomass.LLF5%>%
ggplot(aes(x=Clock.Today, y=RootP1))+geom_line(size=1)+theme_bw()+mytheme3+
geom_point(aes(y=RootWt))+geom_line(aes(y=RootP2))+geom_line(aes(y=RootP3))+geom_line(aes(y=RootP4))+geom_line(aes(y=RootP5))+geom_line(aes(y=RootP6))+geom_line(aes(y=RootP7))+geom_line(aes(y=RootP8))+geom_line(aes(y=RootP9))+geom_line(aes(y=RootP10))+geom_line(aes(y=RootPA))+xlab("Date")+
ylab("Root biomass (kg/ha)")
ggsave("D:/R/Pictures/C5/Yield/RootGrowthE5ILLF5.png", width=8, height=4, dpi=500)

E5HHF5
Biomass.HHF5<-Biomass%>%
filter(ID=="E5IHHF5")%>%
filter(RootRespiration1!="NA")
Biomass.HHF5%>%
ggplot(aes(x=Clock.Today, y=RootRespiration1))+geom_line(size=1)+theme_bw()+mytheme3+
geom_point(aes(y=RootWt,size=2))+ggtitle(paste0("E5IHHF5"))+
xlab("Date")+ylab("Root biomass (kg/ha)")+theme(legend.title=element_blank(),legend.position = "blank")
predicted Vs observed
Biomass.HHF5%>%
ggplot(aes(x=Clock.Today, y=RootP1))+geom_line(size=1)+theme_bw()+mytheme3+
geom_point(aes(y=RootWt))+geom_line(aes(y=RootP2))+geom_line(aes(y=RootP3))+geom_line(aes(y=RootP4))+geom_line(aes(y=RootP5))+geom_line(aes(y=RootP6))+geom_line(aes(y=RootP7))+geom_line(aes(y=RootP8))+geom_line(aes(y=RootP9))+geom_line(aes(y=RootP10))+geom_line(aes(y=RootPA))+xlab("Date")+
ylab("Root biomass (kg/ha)")
ggsave("D:/R/Pictures/C5/Yield/RootGrowthE5IHHF5.png", width=8, height=4, dpi=500)
E5SSF5
Biomass.SSF5<-Biomass%>%
filter(ID=="E5ISSF5")%>%
filter(RootRespiration1!="NA")
Biomass.SSF5%>%
ggplot(aes(x=Clock.Today, y=RootRespiration1))+geom_line(size=1)+theme_bw()+mytheme3+
geom_point(aes(y=RootWt,size=2,color="blue"))
predicted Vs observed
Biomass.SSF5%>%
ggplot(aes(x=Clock.Today, y=RootP1))+geom_line(size=1)+theme_bw()+mytheme3+
geom_point(aes(y=RootWt))+geom_line(aes(y=RootP2))+geom_line(aes(y=RootP3))+geom_line(aes(y=RootP4))+geom_line(aes(y=RootP5))+geom_line(aes(y=RootP6))+geom_line(aes(y=RootP7))+geom_line(aes(y=RootP8))+geom_line(aes(y=RootP9))+geom_line(aes(y=RootP10))+geom_line(aes(y=RootPA))+xlab("Date")+
ylab("Root biomass (kg/ha)")
ggsave("D:/R/Pictures/C5/Yield/RootGrowthE5ISSF5.png", width=8, height=4, dpi=500)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgICANCmxpYnJhcnkoaHlkcm9HT0YpDQpsaWJyYXJ5KHh0YWJsZSkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShSU1FMaXRlKQ0KbGlicmFyeShhZ3JpY29sYWUpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoem9vKQ0KbGlicmFyeShwb2x5bm9tKQ0KDQpgYGANCiMjIGxvZGUgb2JzZXJ2ZWQgZGF0YQ0KYGBge3J9DQp1cERpciA8LSAiRDovUi9Db21iaW5lZERhdGEvIg0Kb2JzRGF0YSA8LSAiRDovUi9Db21iaW5lZERhdGEvIg0KDQpvYnNBbGwgPC0gcmVhZC50YWJsZShwYXN0ZTAob2JzRGF0YSwgIk9ic0FsbDEudHh0IiksDQogICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkNCm9ic0E0PC0gb2JzQWxsICU+JQ0KICBkcGx5cjo6ZmlsdGVyKENvbGxlY3Rpb249PSIyMDE0XzIwMTgiKSU+JQ0KICBtdXRhdGUoU3RhcnREYXRlPWRteShTdGFydERhdGUpLE1pZERhdGU9ZG15KE1pZERhdGUpLEZpbmlzaERhdGU9ZG15KEZpbmlzaERhdGUpLENsb2NrLlRvZGF5PWRteShDbG9jay5Ub2RheSkpICU+JQ0KICAjbXV0YXRlKFNvd2luZ0RhdGU9YXMuZmFjdG9yKGlmZWxzZShTb3dpbmdEYXRlPT0ibm8iLCJTZF9ObyIscGFzdGUwKCJTZF8iLFNvd2luZ0RhdGUpKSkpICU+JSAjIGFzc3VtZSB0aGlzIGlzIHR5cG8gdG8gYmUgZml4ZWQ/DQogIG11dGF0ZShHcm93dGhTZWFzb24xPWFzLmZhY3RvcihwYXN0ZTAoIkdzXyIsR3Jvd3RoU2Vhc29uKSkpICU+JSAjIGNyZWF0aW5nIG1vcmUgaW50dWl0aXZlIGxhYmVscyBoZXJlDQogIG11dGF0ZShSb3RhdGlvbjE9YXMuZmFjdG9yKHBhc3RlMCgiUnRfIixSb3RhdGlvbikpKSAlPiUNCiAgbXV0YXRlKEV4cFVuaXRDb2RlPWFzLmZhY3RvcihwYXN0ZTAoTmFtZSxHcm93dGhTZWFzb24xLFJvdGF0aW9uMSkpKSAlPiUNCiAgbXV0YXRlKENsb2NrLlRvZGF5MSA9IGFzLlBPU0lYY3QocGFzdGUoQ2xvY2suVG9kYXksVGltZSksZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIpKSU+JQ0KICBtdXRhdGUoR3Jvd3RoU2Vhc29uMj1hcy5mYWN0b3IocGFzdGUwKCJZIixHcm93dGhTZWFzb24sIigiLFBlcmlvZCwiKSIpKSkgJT4lDQogIG11dGF0ZShSb3RhdGlvbjI9YXMuZmFjdG9yKGlmZWxzZShSb3RhdGlvbj09IjEiLHBhc3RlMCgiUyIsUm90YXRpb24pLHBhc3RlMCgiUiIsUm90YXRpb24pKSkpDQogDQoNCm9ic0EzPC0gb2JzQWxsICU+JQ0KICBkcGx5cjo6ZmlsdGVyKENvbGxlY3Rpb249PSIyMDAyXzIwMDQiKSU+JQ0KICBtdXRhdGUoU3RhcnREYXRlPWRteShTdGFydERhdGUpLE1pZERhdGU9ZG15KE1pZERhdGUpLEZpbmlzaERhdGU9ZG15KEZpbmlzaERhdGUpLENsb2NrLlRvZGF5PWRteShDbG9jay5Ub2RheSkpICU+JQ0KICAjbXV0YXRlKFNvd2luZ0RhdGU9YXMuZmFjdG9yKGlmZWxzZShTb3dpbmdEYXRlPT0ibm8iLCJTZF9ObyIscGFzdGUwKCJTZF8iLFNvd2luZ0RhdGUpKSkpICU+JSAjIGFzc3VtZSB0aGlzIGlzIHR5cG8gdG8gYmUgZml4ZWQ/DQogIG11dGF0ZShHcm93dGhTZWFzb24xPWFzLmZhY3RvcihwYXN0ZTAoIkdzXyIsR3Jvd3RoU2Vhc29uKSkpICU+JSAjIGNyZWF0aW5nIG1vcmUgaW50dWl0aXZlIGxhYmVscyBoZXJlDQogIG11dGF0ZShSb3RhdGlvbjE9YXMuZmFjdG9yKHBhc3RlMCgiUnRfIixSb3RhdGlvbikpKSAlPiUNCiAgbXV0YXRlKEV4cFVuaXRDb2RlPWFzLmZhY3RvcihwYXN0ZTAoTmFtZSxHcm93dGhTZWFzb24xLFJvdGF0aW9uMSkpKSAlPiUNCiAgbXV0YXRlKENsb2NrLlRvZGF5MSA9IGFzLlBPU0lYY3QocGFzdGUoQ2xvY2suVG9kYXksVGltZSksZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIpKSU+JQ0KICBtdXRhdGUoR3Jvd3RoU2Vhc29uMj1hcy5mYWN0b3IocGFzdGUwKCJZIixHcm93dGhTZWFzb24sIigiLFBlcmlvZCwiKSIpKSkgJT4lDQogIG11dGF0ZShSb3RhdGlvbjI9YXMuZmFjdG9yKHBhc3RlMCgiUiIsUm90YXRpb24pKSkNCiAgDQpvYnNBUjwtcmJpbmQob2JzQTMsb2JzQTQpDQpzdW1tYXJ5KG9ic0FSKQ0KIG9ic0FSDQoNCg0KYGBgDQpgYGB7cn0NCnVwRGlyIDwtICJEOi9SL0NvbWJpbmVkRGF0YS8iDQpvYnNEYXRhIDwtICJEOi9SL0NvbWJpbmVkRGF0YS8iDQoNCm9ic1NSRiA8LSByZWFkLnRhYmxlKHBhc3RlMChvYnNEYXRhLCAiRGVmb2xpYXRpb24udHh0IiksDQogICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkNCm9ic0RTPC0gb2JzU1JGICU+JQ0KICAjZHBseXI6OmZpbHRlcihGRD09IkZENSIpJT4lDQogIG11dGF0ZShTdGFydERhdGU9ZG15KFN0YXJ0RGF0ZSksTWlkRGF0ZT1kbXkoTWlkRGF0ZSksRmluaXNoRGF0ZT1kbXkoRmluaXNoRGF0ZSksQ2xvY2suVG9kYXk9ZG15KENsb2NrLlRvZGF5KSklPiUNCiAgbXV0YXRlKEdyb3d0aFNlYXNvbjE9YXMuZmFjdG9yKHBhc3RlMCgiR3NfIixHcm93dGhTZWFzb24pKSkgJT4lICMgY3JlYXRpbmcgbW9yZSBpbnR1aXRpdmUgbGFiZWxzIGhlcmUNCiAgbXV0YXRlKFJvdGF0aW9uMT1hcy5mYWN0b3IocGFzdGUwKCJSdF8iLFJvdGF0aW9uKSkpICU+JQ0KICBtdXRhdGUoRXhwVW5pdENvZGU9YXMuZmFjdG9yKHBhc3RlMChOYW1lLEdyb3d0aFNlYXNvbjEsUm90YXRpb24xKSkpICU+JQ0KICBtdXRhdGUoQ2xvY2suVG9kYXkxID0gYXMuUE9TSVhjdChwYXN0ZShDbG9jay5Ub2RheSxUaW1lKSxmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIikpJT4lDQogIG11dGF0ZShHcm93dGhTZWFzb24yPWFzLmZhY3RvcihwYXN0ZTAoIlkiLEdyb3d0aFNlYXNvbiwiKCIsUGVyaW9kLCIpIikpKSAlPiUNCiBtdXRhdGUoUm90YXRpb24yPWFzLmZhY3RvcihwYXN0ZTAoIlIiLFJvdGF0aW9uKSkpJT4lDQogICBkcGx5cjo6ZmlsdGVyKFZhcmlhYmxlPT1jKCJzaG9vdGJpb21hc3MiKSkNCiBvYnNEUw0KIG9ic0RSPC0gb2JzU1JGICU+JQ0KICAjZHBseXI6OmZpbHRlcihGRD09IkZENSIpJT4lDQogIG11dGF0ZShTdGFydERhdGU9ZG15KFN0YXJ0RGF0ZSksTWlkRGF0ZT1kbXkoTWlkRGF0ZSksRmluaXNoRGF0ZT1kbXkoRmluaXNoRGF0ZSksQ2xvY2suVG9kYXk9ZG15KENsb2NrLlRvZGF5KSklPiUNCiAgbXV0YXRlKEdyb3d0aFNlYXNvbjE9YXMuZmFjdG9yKHBhc3RlMCgiR3NfIixHcm93dGhTZWFzb24pKSkgJT4lICMgY3JlYXRpbmcgbW9yZSBpbnR1aXRpdmUgbGFiZWxzIGhlcmUNCiAgbXV0YXRlKFJvdGF0aW9uMT1hcy5mYWN0b3IocGFzdGUwKCJSdF8iLFJvdGF0aW9uKSkpICU+JQ0KICBtdXRhdGUoRXhwVW5pdENvZGU9YXMuZmFjdG9yKHBhc3RlMChOYW1lLEdyb3d0aFNlYXNvbjEsUm90YXRpb24xKSkpICU+JQ0KICBtdXRhdGUoQ2xvY2suVG9kYXkxID0gYXMuUE9TSVhjdChwYXN0ZShDbG9jay5Ub2RheSxUaW1lKSxmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIikpJT4lDQogIG11dGF0ZShHcm93dGhTZWFzb24yPWFzLmZhY3RvcihwYXN0ZTAoIlkiLEdyb3d0aFNlYXNvbiwiKCIsUGVyaW9kLCIpIikpKSAlPiUNCiBtdXRhdGUoUm90YXRpb24yPWFzLmZhY3RvcihwYXN0ZTAoIlIiLFJvdGF0aW9uKSkpJT4lDQogICBkcGx5cjo6ZmlsdGVyKFZhcmlhYmxlPT1jKCJSb290V3QiKSkNCiBvYnNEU1I8LXJiaW5kKG9ic0RTLG9ic0RSKQ0KIA0KIHdyaXRlLmNzdiggb2JzRFNSLCJEOi9SL0NvbWJpbmVkRGF0YS9vYnNEU1IuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpIA0KYGBgDQojIyBvYnMgVnMgUHJlIGZvciBlYWNoIGV4cGVyaW1lbnQNCmBgYHtyfQ0KdXBEaXIgPC0gIkQ6L1IvIg0Kb2JzRGF0YSA8LSAiRDovUi9UdEFsbC8iDQoNClR0PC0gcmVhZC50YWJsZShwYXN0ZTAob2JzRGF0YSwgImRmLmFsbC50eHQiKSwNCiAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpDQpUdEEgPC0gVHQgJT4lIG11dGF0ZShDbG9jay5Ub2RheT1kbXkoQ2xvY2suVG9kYXkpLCBFeHBVbml0Q29kZT1hcy5mYWN0b3IoRXhwTmFtZSkpDQpUdEENCk9ic0RSU1IxIDwtbWVyZ2Uob2JzRFNSLFR0QSxieT1jKCJDbG9jay5Ub2RheSIsIkV4cFVuaXRDb2RlIikpICU+JQ0KICBtdXRhdGUoR3Jvd3RoUm90YXRpb249YXMuZmFjdG9yKHBhc3RlMChHcm93dGhTZWFzb24ueCxSb3RhdGlvbi54KSkpJT4lDQogIGRwbHlyOjpmaWx0ZXIoV2F0ZXIueD09ImlyciIpJT4lDQogIGRwbHlyOjpmaWx0ZXIoVmFyaWFibGU9PSJSb290V3QiKQ0KICANCk9ic0RSU1MxIDwtbWVyZ2Uob2JzRFNSLFR0QSxieT1jKCJDbG9jay5Ub2RheSIsIkV4cFVuaXRDb2RlIikpICU+JQ0KICBtdXRhdGUoR3Jvd3RoUm90YXRpb249YXMuZmFjdG9yKHBhc3RlMChHcm93dGhTZWFzb24ueCxSb3RhdGlvbi54KSkpJT4lDQogIGRwbHlyOjpmaWx0ZXIoV2F0ZXIueD09ImlyciIpJT4lDQogIGRwbHlyOjpmaWx0ZXIoVmFyaWFibGU9PSJzaG9vdGJpb21hc3MiKQ0KT2JzRFJTMTwtcmJpbmQoT2JzRFJTUjEsT2JzRFJTUzEpDQpzdW1tYXJ5KE9ic0RSUzEpDQpgYGANCiMjI0NvbWJpbmUgb2JzZXJ2ZWQgZGF0YSB3aXRoIFR0DQpgYGB7cn0NCnVwRGlyIDwtICJEOi9SLyINCm9ic0RhdGEgPC0gIkQ6L1IvVHRBbGwvIg0KDQpUdDwtIHJlYWQudGFibGUocGFzdGUwKG9ic0RhdGEsICJkZi5hbGwudHh0IiksDQogICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKQ0KVHRBIDwtIFR0ICU+JSBtdXRhdGUoQ2xvY2suVG9kYXk9ZG15KENsb2NrLlRvZGF5KSwgRXhwVW5pdENvZGU9YXMuZmFjdG9yKEV4cE5hbWUpKQ0KVHRBDQpPYnNSU1IxIDwtbWVyZ2Uob2JzQVIsVHRBLGJ5PWMoIkNsb2NrLlRvZGF5IiwiRXhwVW5pdENvZGUiKSkgJT4lDQogIG11dGF0ZShHcm93dGhSb3RhdGlvbj1hcy5mYWN0b3IocGFzdGUwKEdyb3d0aFNlYXNvbi54LFJvdGF0aW9uLngpKSklPiUNCiAgZHBseXI6OmZpbHRlcihUYmI9PTEpJT4lDQogIGRwbHlyOjpmaWx0ZXIoV2F0ZXIueD09ImlyciIpJT4lDQogIGRwbHlyOjpmaWx0ZXIoRGVmb2xpYXRpb24ueD09IkxMIiklPiUNCiAgZHBseXI6OmZpbHRlcihWYXJpYWJsZT09IlJvb3RXdCJ8VmFyaWFibGU9PSJzaG9vdGJpb21hc3MiKSU+JQ0KICAgbXV0YXRlKENsb2NrLlRvZGF5MSA9IGFzLlBPU0lYY3QocGFzdGUoQ2xvY2suVG9kYXksVGltZSksZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIpKQ0KDQpPYnNSU1MxIDwtbWVyZ2Uob2JzQVIsVHRBLGJ5PWMoIkNsb2NrLlRvZGF5IiwiRXhwVW5pdENvZGUiKSkgJT4lDQogIG11dGF0ZShHcm93dGhSb3RhdGlvbj1hcy5mYWN0b3IocGFzdGUwKEdyb3d0aFNlYXNvbi54LFJvdGF0aW9uLngpKSklPiUNCiAgZHBseXI6OmZpbHRlcihUYmI9PTEpJT4lDQogIGRwbHlyOjpmaWx0ZXIoV2F0ZXIueD09ImlyciIpJT4lDQogIGRwbHlyOjpmaWx0ZXIoRGVmb2xpYXRpb24ueD09IkxMIiklPiUNCiAgZHBseXI6OmZpbHRlcihWYXJpYWJsZT09IlJvb3RXdCJ8VmFyaWFibGU9PSJzaG9vdGJpb21hc3MiKSU+JQ0KICAgbXV0YXRlKENsb2NrLlRvZGF5MSA9IGFzLlBPU0lYY3QocGFzdGUoQ2xvY2suVG9kYXksVGltZSksZm9ybWF0PSIlWS0lbS0lZCAlSDolTTolUyIpKQ0KT2JzUlMxPC1yYmluZChPYnNSU1IxLE9ic1JTUzEpICANCnN1bW1hcnkoT2JzUlMxKQ0KYGBgDQpgYGB7cn0NCm15dGhlbWUxPC10aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCxhbmdsZT05MCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQoNCm15dGhlbWUzPC10aGVtZSgNCiAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPTE0LCBmYWNlPSJib2xkIiksDQogICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplID0gMTQsZmFjZT0icGxhaW4iKSwNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCB2anVzdCA9IDAuNSwgc2l6ZSA9IDE0KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLCBsZWdlbmQuYm94ID0gInZlcnRpY2FsIikNCmBgYA0KDQoNCiMjUGxvdCBkYXRhDQoNCmBgYHtyLGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpPYnNSUzEkVmFyaWFibGU8LSBmYWN0b3IoT2JzUlMxJFZhcmlhYmxlLCBsZXZlbHM9Yygic2hvb3RiaW9tYXNzIiwiUm9vdFd0IikpDQpFM0lMTDwtT2JzUlMxJT4lDQogIGZpbHRlcihJRD09IkUzSUxMIikNCiMgc2ltRDE8LXNpbUQlPiUNCiMgICAgbXV0YXRlKENsb2NrLlRvZGF5ID0geW1kX2htcyhDbG9jay5Ub2RheSkpJT4lDQojICAgIGRwbHlyOjpmaWx0ZXIoVmFyaWFibGU9PSJSb290V3QifFZhcmlhYmxlPT0ic2hvb3RiaW9tYXNzIiklPiUNCiMgICAgZHBseXI6OmZpbHRlcihDbG9jay5Ub2RheT4iMjAwMi0wNi0wMSIpJT4lDQojICAgIGRwbHlyOjpmaWx0ZXIoTmFtZT09Ikl2ZXJzZW5fOTFEZWZvbGlhdGlvbkxMIikNCiMgICBzaW1EMSRWYXJpYWJsZTwtIGZhY3Rvciggc2ltRDEkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkgIA0KIyBSb290Lkw8LVJvb3QuZGZBJT4lDQojICAgZHBseXI6OmZpbHRlcihOYW1lPT1jKCJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCIpKQ0KIyAgIA0KICANCkUzSUxMJT4lDQogIGRwbHlyOjpmaWx0ZXIoR3Jvd3RoU2Vhc29uLng9PSIxIiklPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkLGNvbG9yPVZhcmlhYmxlKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkKSkrZ2VvbV9wb2ludChzaXplPTMpKw0KICBmYWNldF9ncmlkKFZhcmlhYmxlfklEKStnZ3RpdGxlKHBhc3RlMCgiRTNJTEwiLCIoSXZlcnNlbl85MURlZm9saWF0aW9uTEwpIikpKw0KICAjZ2VvbV9wb2ludChkYXRhPVJvb3QuTCxhZXMoeD1DbG9jay5Ub2RheTEseT1Sb290V3Qsc2l6ZT0yKSkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoIkJpb21hc3MgKGtnL2hhKSIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQojZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9FM0lMTC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KYGBge3IsZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0NCk9ic1JTMSRWYXJpYWJsZTwtIGZhY3RvcihPYnNSUzEkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkNCkUzSUxMPC1PYnNSUzElPiUNCiAgZmlsdGVyKElEPT0iRTNJTEwiKQ0KIyBzaW1EMTwtc2ltRCU+JQ0KIyAgICBtdXRhdGUoQ2xvY2suVG9kYXkgPSB5bWRfaG1zKENsb2NrLlRvZGF5KSklPiUNCiMgICAgZHBseXI6OmZpbHRlcihWYXJpYWJsZT09IlJvb3RXdCJ8VmFyaWFibGU9PSJzaG9vdGJpb21hc3MiKSU+JQ0KIyAgICBkcGx5cjo6ZmlsdGVyKENsb2NrLlRvZGF5PiIyMDAyLTA2LTAxIiklPiUNCiMgICAgZHBseXI6OmZpbHRlcihOYW1lPT0iSXZlcnNlbl85MURlZm9saWF0aW9uTEwiKQ0KIyAgIHNpbUQxJFZhcmlhYmxlPC0gZmFjdG9yKCBzaW1EMSRWYXJpYWJsZSwgbGV2ZWxzPWMoInNob290YmlvbWFzcyIsIlJvb3RXdCIpKSAgDQojIFJvb3QuTDwtUm9vdC5kZkElPiUNCiMgICBkcGx5cjo6ZmlsdGVyKE5hbWU9PWMoIkl2ZXJzZW5fOTFEZWZvbGlhdGlvbkxMIikpDQojICAgDQogIA0KRTNJTEwlPiUNCiAgZHBseXI6OmZpbHRlcihHcm93dGhTZWFzb24ueD09IjIiKSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQsY29sb3I9VmFyaWFibGUpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQpKStnZW9tX3BvaW50KHNpemU9MykrDQogIGZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFM0lMTCIsIihJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCkiKSkrDQogICNnZW9tX3BvaW50KGRhdGE9Um9vdC5MLGFlcyh4PUNsb2NrLlRvZGF5MSx5PVJvb3RXdCxzaXplPTIpKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSt4bGFiKCJEYXRlIikreWxhYigiQmlvbWFzcyAoa2cvaGEpIikrDQogICNyZW1vdmUgZ3JpZCBsaW5lcyANCiAgIHRoZW1lKA0KICAgICBwYW5lbC5zcGFjaW5nPXVuaXQoLjAxLCAibGluZXMiKSwNCiAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsc2l6ZT0xKSwgDQogICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLHNpemUgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCB2anVzdD0wLjUsIGhqdXN0ID0gMSksDQogICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiLHNpemU9MSksDQogICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBhbmdsZT0wLCBmYWNlID0gInBsYWluIiksIA0KICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0icGxhaW4iKSwNCiAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPTE0LCBmYWNlPSJib2xkIiksDQogICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCB2anVzdCA9IDAuNSwgc2l6ZSA9IDE0KSkNCiNnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvL0UzSUxMLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KYGBgDQoNCmBgYHtyLGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpFM0lMTCU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQsY29sb3I9VmFyaWFibGUpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQpKStnZW9tX3BvaW50KHNpemU9MykrDQogICNnZW9tX2xpbmUoeT01NTAwLHNpemU9MikrDQogIGZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFM0lMTCIsIihJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCkiKSkrDQogICNnZW9tX3BvaW50KGRhdGE9Um9vdC5MLGFlcyh4PUNsb2NrLlRvZGF5MSx5PVJvb3RXdCxzaXplPTIpKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSt4bGFiKCJEYXRlIikreWxhYigiQmlvbWFzcyAoa2cvaGEpIikrDQogICNyZW1vdmUgZ3JpZCBsaW5lcyANCiAgIHRoZW1lKA0KICAgICBwYW5lbC5zcGFjaW5nPXVuaXQoLjAxLCAibGluZXMiKSwNCiAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsc2l6ZT0xKSwgDQogICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLHNpemUgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCB2anVzdD0wLjUsIGhqdXN0ID0gMSksDQogICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiLHNpemU9MSksDQogICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBhbmdsZT0wLCBmYWNlID0gInBsYWluIiksIA0KICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0icGxhaW4iKSwNCiAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPTE0LCBmYWNlPSJib2xkIiksDQogICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCB2anVzdCA9IDAuNSwgc2l6ZSA9IDE0KSkNCiNnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvL0UzSUxMLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KYGBgDQoNCiMjI0U1TFMNCg0KYGBge3IsZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0NCm9ic0RTUiRWYXJpYWJsZTwtIGZhY3RvcihvYnNEU1IkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkNCkUzSUxTPC1vYnNEU1IlPiUNCiAgZmlsdGVyKElEPT0iRTNJTFMiKQ0KRTNJTFMlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkLGNvbG9yPVZhcmlhYmxlKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkKSkrZ2VvbV9wb2ludChzaXplPTMpKw0KICAjZ2VvbV9saW5lKHk9NTUwMCxzaXplPTIpKw0KICBmYWNldF9ncmlkKFZhcmlhYmxlfklEKStnZ3RpdGxlKHBhc3RlMCgiRTNJTFMiLCIoSXZlcnNlbl85MURlZm9saWF0aW9uTFMpIikpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKSsNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KICAgdGhlbWUoDQogICAgIHBhbmVsLnNwYWNpbmc9dW5pdCguMDEsICJsaW5lcyIpLA0KICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIixzaXplPTEpLCANCiAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsc2l6ZSA9IDEpLA0KICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIHZqdXN0PTAuNSwgaGp1c3QgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsc2l6ZT0xKSwNCiAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGFuZ2xlPTAsIGZhY2UgPSAicGxhaW4iKSwgDQogICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJwbGFpbiIpLA0KICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSwNCiAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMC41LCBzaXplID0gMTQpKQ0KI2dnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vRTNJTFMucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQpgYGANCiMjI0U1U0wNCg0KYGBge3IsZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0NCm9ic0RTUiRWYXJpYWJsZTwtIGZhY3RvcihvYnNEU1IkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkNCkUzSVNMPC1vYnNEU1IlPiUNCiAgZmlsdGVyKElEPT0iRTNJU0wiKQ0KRTNJU0wlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQsY29sb3I9VmFyaWFibGUpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQpKStnZW9tX3BvaW50KHNpemU9MykrDQogIGZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFM0lTTCIsIihJdmVyc2VuXzkxRGVmb2xpYXRpb25TTCkiKSkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoIkJpb21hc3MgKGtnL2hhKSIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvL0UzSVNMLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KYGBgDQojI0UzSVNTDQpgYGB7cixmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQ0Kb2JzRFNSJFZhcmlhYmxlPC0gZmFjdG9yKG9ic0RTUiRWYXJpYWJsZSwgbGV2ZWxzPWMoInNob290YmlvbWFzcyIsIlJvb3RXdCIpKQ0KRTNJU1M8LW9ic0RTUiU+JQ0KICBmaWx0ZXIoSUQ9PSJFM0lTUyIpDQpFM0lTUyU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQsY29sb3I9VmFyaWFibGUpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQpKStnZW9tX3BvaW50KHNpemU9MykrDQogIyBnZW9tX2xpbmUoeT01NTAwLHNpemU9MikrDQogIGZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFM0lTUyIsIihJdmVyc2VuXzkxRGVmb2xpYXRpb25TUykiKSkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoIkJpb21hc3MgKGtnL2hhKSIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvL0UzSVNTLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KYGBgDQoNCiMjI0U1SUxMRjUNCmBgYHtyLGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpPYnNSUzEkVmFyaWFibGU8LSBmYWN0b3IoT2JzUlMxJFZhcmlhYmxlLCBsZXZlbHM9Yygic2hvb3RiaW9tYXNzIiwiUm9vdFd0IikpDQpFNUlMTEY1PC1PYnNSUzElPiUNCiAgZmlsdGVyKElEPT0iRTVJTExGNSIpDQojIHNpbUQxPC1zaW1EJT4lDQojICAgIG11dGF0ZShDbG9jay5Ub2RheSA9IHltZF9obXMoQ2xvY2suVG9kYXkpKSU+JQ0KIyAgICBkcGx5cjo6ZmlsdGVyKFZhcmlhYmxlPT0iUm9vdFd0InxWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQojICAgIGRwbHlyOjpmaWx0ZXIoQ2xvY2suVG9kYXk+IjIwMDItMDYtMDEiKSU+JQ0KIyAgICBkcGx5cjo6ZmlsdGVyKE5hbWU9PSJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCIpDQojICAgc2ltRDEkVmFyaWFibGU8LSBmYWN0b3IoIHNpbUQxJFZhcmlhYmxlLCBsZXZlbHM9Yygic2hvb3RiaW9tYXNzIiwiUm9vdFd0IikpICANCiMgUm9vdC5MPC1Sb290LmRmQSU+JQ0KIyAgIGRwbHlyOjpmaWx0ZXIoTmFtZT09YygiSXZlcnNlbl85MURlZm9saWF0aW9uTEwiKSkNCiMgICANCiAgDQpFNUlMTEY1JT4lDQpnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXkseT1PYnNlcnZlZCxjb2xvcj1WYXJpYWJsZSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogIGdlb21fcG9pbnQoYWVzKHg9Q2xvY2suVG9kYXkseT1PYnNlcnZlZCkpK2dlb21fcG9pbnQoc2l6ZT0zKSsNCiAgZmFjZXRfZ3JpZChWYXJpYWJsZX5JRCkrZ2d0aXRsZShwYXN0ZTAoIkU1SUxMRjUiLCIoSXZlcnNlbl8xMjFEZWZvbGlhdGlvbkxMRkQ1KSIpKSsNCiAgI2dlb21fcG9pbnQoZGF0YT1Sb290LkwsYWVzKHg9Q2xvY2suVG9kYXkxLHk9Um9vdFd0LHNpemU9MikpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKSsNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KICAgdGhlbWUoDQogICAgIHBhbmVsLnNwYWNpbmc9dW5pdCguMDEsICJsaW5lcyIpLA0KICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIixzaXplPTEpLCANCiAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsc2l6ZSA9IDEpLA0KICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIHZqdXN0PTAuNSwgaGp1c3QgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsc2l6ZT0xKSwNCiAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGFuZ2xlPTAsIGZhY2UgPSAicGxhaW4iKSwgDQogICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJwbGFpbiIpLA0KICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSwNCiAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMC41LCBzaXplID0gMTQpKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL0U1SUxMRjUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQpgYGANCg0KIyNFNUlTU0Y1DQpgYGB7cixmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQ0Kb2JzRFNSJFZhcmlhYmxlPC0gZmFjdG9yKG9ic0RTUiRWYXJpYWJsZSwgbGV2ZWxzPWMoInNob290YmlvbWFzcyIsIlJvb3RXdCIpKQ0KRTVJU1NGNTwtb2JzRFNSJT4lDQogIGZpbHRlcihJRD09IkU1SVNTRjUiKQ0KRTVJU1NGNSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQsY29sb3I9VmFyaWFibGUpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQpKStnZW9tX3BvaW50KHNpemU9MykrDQogIGZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFNUlTU0Y1IiwiKEl2ZXJzZW5fMTIxRGVmb2xpYXRpb25TU0ZENSkiKSkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoIkJpb21hc3MgKGtnL2hhKSIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvRTVJU1NGNS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KDQojIyNsb2FkIFJvb3QgYW5kIHNob290IGRhdGEgZm9yIEhIDQoNCmBgYHtyLGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpvYnNEU1IkVmFyaWFibGU8LSBmYWN0b3Iob2JzRFNSJFZhcmlhYmxlLCBsZXZlbHM9Yygic2hvb3RiaW9tYXNzIiwiUm9vdFd0IikpDQpFNUlISEZENTwtb2JzRFNSJT4lDQogIGZpbHRlcihJRD09IkU1SUhIRjUiKSU+JQ0KICBtdXRhdGUoR3Jvd3RoUm90YXRpb249cGFzdGUwKEdyb3d0aFNlYXNvbixSb3RhdGlvbikpDQpFNUlISEZENSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQsY29sb3I9VmFyaWFibGUpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LHk9T2JzZXJ2ZWQpKStnZW9tX3BvaW50KHNpemU9MykrDQogIGZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFNUlISEY1IiwiKEl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZENSkiKSkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoIkJpb21hc3MgKGtnL2hhKSIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvRTVJSEhGNS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KYGBge3IsZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0NCm9ic0RTUiRWYXJpYWJsZTwtIGZhY3RvcihvYnNEU1IkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkNCkU1SUhIRkQyPC1vYnNEU1IlPiUNCiAgZmlsdGVyKElEPT0iRTVJSEhGMiIpJT4lDQogIG11dGF0ZShHcm93dGhSb3RhdGlvbj1wYXN0ZTAoR3Jvd3RoU2Vhc29uLFJvdGF0aW9uKSkNCkU1SUhIRkQyJT4lDQpnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXkseT1PYnNlcnZlZCxjb2xvcj1WYXJpYWJsZSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogIGdlb21fcG9pbnQoYWVzKHg9Q2xvY2suVG9kYXkseT1PYnNlcnZlZCkpK2dlb21fcG9pbnQoc2l6ZT0zKSsNCiAgZmFjZXRfZ3JpZChWYXJpYWJsZX5JRCkrZ2d0aXRsZShwYXN0ZTAoIkU1SUhIRjUiKSkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoIkJpb21hc3MgKGtnL2hhKSIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvL0U1SUhIRjIucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQpgYGANCg0KDQojI0U1SUxMRjIgDQpgYGB7cn0NCk9ic1JTMSRWYXJpYWJsZTwtIGZhY3RvcihPYnNSUzEkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkNCkU1SUxMRjI8LU9ic1JTMSU+JQ0KICBmaWx0ZXIoSUQ9PSJFNUlMTEYyIikNCiMgc2ltRDE8LXNpbUQlPiUNCiMgICAgbXV0YXRlKENsb2NrLlRvZGF5ID0geW1kX2htcyhDbG9jay5Ub2RheSkpJT4lDQojICAgIGRwbHlyOjpmaWx0ZXIoVmFyaWFibGU9PSJSb290V3QifFZhcmlhYmxlPT0ic2hvb3RiaW9tYXNzIiklPiUNCiMgICAgZHBseXI6OmZpbHRlcihDbG9jay5Ub2RheT4iMjAwMi0wNi0wMSIpJT4lDQojICAgIGRwbHlyOjpmaWx0ZXIoTmFtZT09Ikl2ZXJzZW5fOTFEZWZvbGlhdGlvbkxMIikNCiMgICBzaW1EMSRWYXJpYWJsZTwtIGZhY3Rvciggc2ltRDEkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkgIA0KIyBSb290Lkw8LVJvb3QuZGZBJT4lDQojICAgZHBseXI6OmZpbHRlcihOYW1lPT1jKCJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCIpKQ0KIyAgIA0KICANCkU1SUxMRjIlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkLGNvbG9yPVZhcmlhYmxlKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkKSkrZ2VvbV9wb2ludChzaXplPTMpKw0KICBmYWNldF9ncmlkKFZhcmlhYmxlfklEKSsNCiAgI2dlb21fcG9pbnQoZGF0YT1Sb290LkwsYWVzKHg9Q2xvY2suVG9kYXkxLHk9Um9vdFd0LHNpemU9MikpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKSsNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KICAgdGhlbWUoDQogICAgIHBhbmVsLnNwYWNpbmc9dW5pdCguMDEsICJsaW5lcyIpLA0KICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIixzaXplPTEpLCANCiAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsc2l6ZSA9IDEpLA0KICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIHZqdXN0PTAuNSwgaGp1c3QgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsc2l6ZT0xKSwNCiAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGFuZ2xlPTAsIGZhY2UgPSAicGxhaW4iKSwgDQogICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJwbGFpbiIpLA0KICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSwNCiAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMC41LCBzaXplID0gMTQpKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9FNUlMTEYyLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KYGBgDQoNCiMjI0U1SUxMRjEwDQpgYGB7cn0NCk9ic1JTMSRWYXJpYWJsZTwtIGZhY3RvcihPYnNSUzEkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkNCkU1SUxMRjEwPC1PYnNSUzElPiUNCiAgZmlsdGVyKElEPT0iRTVJTExGMTAiKQ0KIyBzaW1EMTwtc2ltRCU+JQ0KIyAgICBtdXRhdGUoQ2xvY2suVG9kYXkgPSB5bWRfaG1zKENsb2NrLlRvZGF5KSklPiUNCiMgICAgZHBseXI6OmZpbHRlcihWYXJpYWJsZT09IlJvb3RXdCJ8VmFyaWFibGU9PSJzaG9vdGJpb21hc3MiKSU+JQ0KIyAgICBkcGx5cjo6ZmlsdGVyKENsb2NrLlRvZGF5PiIyMDAyLTA2LTAxIiklPiUNCiMgICAgZHBseXI6OmZpbHRlcihOYW1lPT0iSXZlcnNlbl85MURlZm9saWF0aW9uTEwiKQ0KIyAgIHNpbUQxJFZhcmlhYmxlPC0gZmFjdG9yKCBzaW1EMSRWYXJpYWJsZSwgbGV2ZWxzPWMoInNob290YmlvbWFzcyIsIlJvb3RXdCIpKSAgDQojIFJvb3QuTDwtUm9vdC5kZkElPiUNCiMgICBkcGx5cjo6ZmlsdGVyKE5hbWU9PWMoIkl2ZXJzZW5fOTFEZWZvbGlhdGlvbkxMIikpDQojICAgDQogIA0KRTVJTExGMTAlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkLGNvbG9yPVZhcmlhYmxlKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkKSkrZ2VvbV9wb2ludChzaXplPTMpKw0KICBmYWNldF9ncmlkKFZhcmlhYmxlfklEKSsNCiAgI2dlb21fcG9pbnQoZGF0YT1Sb290LkwsYWVzKHg9Q2xvY2suVG9kYXkxLHk9Um9vdFd0LHNpemU9MikpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKSsNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KICAgdGhlbWUoDQogICAgIHBhbmVsLnNwYWNpbmc9dW5pdCguMDEsICJsaW5lcyIpLA0KICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIixzaXplPTEpLCANCiAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsc2l6ZSA9IDEpLA0KICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIHZqdXN0PTAuNSwgaGp1c3QgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsc2l6ZT0xKSwNCiAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGFuZ2xlPTAsIGZhY2UgPSAicGxhaW4iKSwgDQogICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJwbGFpbiIpLA0KICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSwNCiAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMC41LCBzaXplID0gMTQpKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9FNUlMTEYxMC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KDQoNCiMjI3Byb29mDQoNCmBgYHtyLGhlaWdodD02LCBmaWcud2lkdGg9OH0NCg0Kb2JzRFNSUjwtb2JzRFNSJT4lDQogIGZpbHRlcihWYXJpYWJsZT09IlJvb3RXdCIpJT4lDQogIG11dGF0ZShSb290V3Q9T2JzZXJ2ZWQpDQpvYnNEU1JTPC1vYnNEU1IlPiUNCiAgIGZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoTmFtZSxDbG9jay5Ub2RheSxPYnNlcnZlZCklPiUNCiAgbXV0YXRlKHNob290YmlvbWFzcz1PYnNlcnZlZCklPiUNCiAgbXV0YXRlKENsb2NrLlRvZGF5PXltZChDbG9jay5Ub2RheSkpJT4lDQogIG11dGF0ZShOYW1lPWZhY3RvcihOYW1lKSkNCiANCkFsbDwtbWVyZ2Uob2JzRFNSUixvYnNEU1JTLGJ5PWMoIkNsb2NrLlRvZGF5IiwiTmFtZSIpKSU+JQ0KICBtdXRhdGUoQmlvbWFzcz1Sb290V3Qrc2hvb3RiaW9tYXNzKSU+JQ0KICBtdXRhdGUoUHJvb3Q9MS1zaG9vdGJpb21hc3MvQmlvbWFzcyklPiUNCiAgbXV0YXRlKEdyb3d0aFJvdGF0aW9uPXBhc3RlMChHcm93dGhTZWFzb24sUm90YXRpb24pKQ0KDQpBbGwlPiUNCiAgZmlsdGVyKEV4cGVyaW1lbnRJRD09IkUzIiklPiUNCiAgdW5pcXVlKCklPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PVByb290LGNvbG9yPUlELGxhYmVsPUdyb3d0aFJvdGF0aW9uKSkrZ2VvbV90ZXh0KCkrDQogIHRoZW1lX2J3KCkrDQogIGZhY2V0X3dyYXAofklELG5jb2wgPSAxKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSt4bGFiKCJEYXRlIikreWxhYigiUHJvb3QiKSsNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KICAgdGhlbWUoDQogICAgIHBhbmVsLnNwYWNpbmc9dW5pdCguMDEsICJsaW5lcyIpLA0KICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIixzaXplPTEpLCANCiAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsc2l6ZSA9IDEpLA0KICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIHZqdXN0PTAuNSwgaGp1c3QgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsc2l6ZT0xKSwNCiAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGFuZ2xlPTAsIGZhY2UgPSAicGxhaW4iKSwgDQogICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJwbGFpbiIpLA0KICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSwNCiAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMC41LCBzaXplID0gMTQpKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL0UzUHJvb3QucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQpgYGANCmBgYHtyLGhlaWdodD00LCBmaWcud2lkdGg9OH0NCkFsbCU+JQ0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTUiKSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9UHJvb3QsY29sb3I9SUQsbGFiZWw9R3Jvd3RoUm90YXRpb24pKStnZW9tX3RleHQoKSsNCiAgdGhlbWVfYncoKSsNCiAgZmFjZXRfd3JhcCh+SUQsbmNvbCA9IDEpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKCJQcm9vdCIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvRTVQcm9vdC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KDQojIyNQcm9vdCBMTA0KYGBge3IsaGVpZ2h0PTQsIGZpZy53aWR0aD04fQ0KT2JzUlMxUjwtT2JzUlMxJT4lDQogIGZpbHRlcihWYXJpYWJsZT09IlJvb3RXdCIpJT4lDQogIG11dGF0ZShSb290V3Q9T2JzZXJ2ZWQpDQpPYnNSUzFTPC1PYnNSUzElPiUNCiAgIGZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoTmFtZSxDbG9jay5Ub2RheSxPYnNlcnZlZCklPiUNCiAgbXV0YXRlKHNob290YmlvbWFzcz1PYnNlcnZlZCklPiUNCiAgbXV0YXRlKENsb2NrLlRvZGF5PXltZChDbG9jay5Ub2RheSkpJT4lDQogIG11dGF0ZShOYW1lPWZhY3RvcihOYW1lKSkNCiANCkxMQWxsPC1tZXJnZShPYnNSUzFSLE9ic1JTMVMsYnk9YygiQ2xvY2suVG9kYXkiLCJOYW1lIikpJT4lDQogIGZpbHRlcihUYmI9PTEpJT4lDQogIG11dGF0ZShCaW9tYXNzPVJvb3RXdCtzaG9vdGJpb21hc3MpJT4lDQogIG11dGF0ZShQcm9vdD0xLXNob290YmlvbWFzcy9CaW9tYXNzKSU+JQ0KICB1bmlxdWUoKQ0KDQpMTEFsbCU+JQ0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTMiKSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9UHJvb3QsY29sb3I9SUQsbGFiZWw9R3Jvd3RoUm90YXRpb24pKStnZW9tX3RleHQoKSsNCiAgdGhlbWVfYncoKSsNCiAgZmFjZXRfd3JhcCh+SUQsbmNvbCA9IDEpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKCJQcm9vdCIpKw0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQogICB0aGVtZSgNCiAgICAgcGFuZWwuc3BhY2luZz11bml0KC4wMSwgImxpbmVzIiksDQogICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLHNpemU9MSksIA0KICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIixzaXplID0gMSksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgdmp1c3Q9MC41LCBoanVzdCA9IDEpLA0KICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIixzaXplPTEpLA0KICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgYW5nbGU9MCwgZmFjZSA9ICJwbGFpbiIpLCANCiAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9InBsYWluIiksDQogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAwLjUsIHNpemUgPSAxNCkpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvRTNMTFByb290LnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KDQpgYGANCmBgYHtyLGhlaWdodD00LCBmaWcud2lkdGg9OH0NCkxMQWxsJT4lDQogIGZpbHRlcihFeHBlcmltZW50SUQ9PSJFNSIpJT4lDQogIGZpbHRlcihzaG9vdGJpb21hc3MhPSIwIiklPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PVByb290LGNvbG9yPUlELGxhYmVsPUdyb3d0aFJvdGF0aW9uKSkrZ2VvbV9saW5lKHNpemU9MikrDQogIHRoZW1lX2J3KCkrDQogIGZhY2V0X3dyYXAofklELG5jb2wgPSAxKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSt4bGFiKCJEYXRlIikreWxhYigiUHJvb3QiKSsNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KICAgdGhlbWUoDQogICAgIHBhbmVsLnNwYWNpbmc9dW5pdCguMDEsICJsaW5lcyIpLA0KICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIixzaXplPTEpLCANCiAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsc2l6ZSA9IDEpLA0KICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIHZqdXN0PTAuNSwgaGp1c3QgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG91cj0iYmxhY2siLHNpemUgPSAxNCksDQogICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsc2l6ZT0xKSwNCiAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGFuZ2xlPTAsIGZhY2UgPSAicGxhaW4iKSwgDQogICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJwbGFpbiIpLA0KICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSwNCiAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMC41LCBzaXplID0gMTQpKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL0U1TExQcm9vdC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KDQoNCiMjI0N1bSBvYmVydmVkDQpgYGB7cn0NCnVuZ3JvdXAucm93d2lzZV9kZiA8LSBmdW5jdGlvbih4KSB7DQogIGNsYXNzKHgpIDwtIGMoICJ0YmxfZGYiLCAiZGF0YS5mcmFtZSIpDQogIHgNCn0NCg0KRTVJSEhGRDVTPC1FNUlISEZENSU+JQ0KZHBseXI6OmZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpDQoNCg0KdW5pR1kgPC0gdW5pcXVlKEU1SUhIRkQ1UyRFeHBVbml0Q29kZSkNCg0KDQoNCmRmLmFsbCA8LSBkYXRhLmZyYW1lKCkNCiANCmZvcihpIGluIDE6bGVuZ3RoKHVuaUdZKSl7DQogIA0KIGN1bTwtRTVJSEhGRDVTJT4lDQogICByb3d3aXNlKCkgJT4lDQogICBtdXRhdGUoR3Jvd3RoUm90YXRpb249cGFzdGUwKEdyb3d0aFJvdGF0aW9uLFJvdGF0aW9uKSklPiUNCiAgdW5ncm91cC5yb3d3aXNlX2RmKCklPiUNCiAgbXV0YXRlKFNob290PWN1bXN1bShPYnNlcnZlZCkpDQogDQogZGYuYWxsIDwtIHJiaW5kKGRmLmFsbCxjdW0pDQogfQ0KICANCnN1bW1hcnkoZGYuYWxsKQ0KZGYuYWxsDQoNCg0KYGBgDQoNCiMjI2xvYWQgUm9vdCBhbmQgc2hvb3QgZGF0YSBmb3IgU1MNCmBgYHtyLGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpvYnNEU1IkVmFyaWFibGU8LSBmYWN0b3Iob2JzRFNSJFZhcmlhYmxlLCBsZXZlbHM9Yygic2hvb3RiaW9tYXNzIiwiUm9vdFd0IikpDQpFNUlTU0ZENTwtb2JzRFNSJT4lDQogIGZpbHRlcihJRD09IkU1SVNTRjUiKQ0KRTVJU1NGRDUlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkLGNvbG9yPVZhcmlhYmxlKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkKSkrZ2VvbV9wb2ludChzaXplPTMpKw0KICBmYWNldF9ncmlkKFZhcmlhYmxlfklEKStnZ3RpdGxlKHBhc3RlMCgiRTVJU1NGNSIpKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSt4bGFiKCJEYXRlIikreWxhYigiQmlvbWFzcyAoa2cvaGEpIikrDQogICNyZW1vdmUgZ3JpZCBsaW5lcyANCiAgIHRoZW1lKA0KICAgICBwYW5lbC5zcGFjaW5nPXVuaXQoLjAxLCAibGluZXMiKSwNCiAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsc2l6ZT0xKSwgDQogICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLHNpemUgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCB2anVzdD0wLjUsIGhqdXN0ID0gMSksDQogICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiLHNpemU9MSksDQogICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBhbmdsZT0wLCBmYWNlID0gInBsYWluIiksIA0KICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0icGxhaW4iKSwNCiAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPTE0LCBmYWNlPSJib2xkIiksDQogICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCB2anVzdCA9IDAuNSwgc2l6ZSA9IDE0KSkNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vRTVJU1NGNS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KIyMjbG9hZCBSb290IGFuZCBzaG9vdCBkYXRhIGZvciBMTA0KYGBge3IsZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0NCk9ic1JTMSRWYXJpYWJsZTwtIGZhY3RvcihPYnNSUzEkVmFyaWFibGUsIGxldmVscz1jKCJzaG9vdGJpb21hc3MiLCJSb290V3QiKSkNCkU1SUxMRjU8LU9ic1JTMSU+JQ0KICBmaWx0ZXIoSUQ9PSJFNUlMTEY1IikNCkU1SUxMRjUlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkLGNvbG9yPVZhcmlhYmxlKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSx5PU9ic2VydmVkKSkrZ2VvbV9wb2ludChzaXplPTMpKw0KICBmYWNldF9ncmlkKFZhcmlhYmxlfklEKStnZ3RpdGxlKHBhc3RlMCgiRTVJTExGNSIpKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSt4bGFiKCJEYXRlIikreWxhYigiQmlvbWFzcyAoa2cvaGEpIikrDQogICNyZW1vdmUgZ3JpZCBsaW5lcyANCiAgIHRoZW1lKA0KICAgICBwYW5lbC5zcGFjaW5nPXVuaXQoLjAxLCAibGluZXMiKSwNCiAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsc2l6ZT0xKSwgDQogICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLHNpemUgPSAxKSwNCiAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCB2anVzdD0wLjUsIGhqdXN0ID0gMSksDQogICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCksDQogICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsY29sb3VyPSJibGFjayIsc2l6ZSA9IDE0KSwNCiAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvdXI9ImJsYWNrIixzaXplID0gMTQpLA0KICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiLHNpemU9MSksDQogICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBhbmdsZT0wLCBmYWNlID0gInBsYWluIiksIA0KICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0icGxhaW4iKSwNCiAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPTE0LCBmYWNlPSJib2xkIiksDQogICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCB2anVzdCA9IDAuNSwgc2l6ZSA9IDE0KSkNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vRTVJTExGNS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KIyMjIGxvYWQgUm9vdCBkYXRhIGFuYWx5c2lzIGRhdGEgZnJhbWUNCmBgYHtyfQ0KdXBEaXIgPC0gIkQ6L1IvIg0KUm9vdGRmIDwtICJEOi9SL0NvbWJpbmVkRGF0YS8iDQoNClJvb3QuZGY8LSByZWFkLnRhYmxlKHBhc3RlMChSb290ZGYsICJSb290LmRhdGFmcmFtZS50eHQiKSwNCiAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpDQpSb290LmRmQSA8LSBSb290LmRmICU+JSBtdXRhdGUoQ2xvY2suVG9kYXk9ZG15KENsb2NrLlRvZGF5KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydERhdGU9ZG15KFN0YXJ0RGF0ZSksRmluaXNoRGF0ZT1kbXkoRmluaXNoRGF0ZSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnREYXRlMT1kbXkoU3RhcnREYXRlMSksRmluaXNoRGF0ZTE9ZG15KEZpbmlzaERhdGUxKSklPiUNCiAgIG11dGF0ZShDbG9jay5Ub2RheTEgPSBhcy5QT1NJWGN0KHBhc3RlKENsb2NrLlRvZGF5LFRpbWUpLGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiKSkNCmBgYA0KDQojI1JlbW9ibGlzYXRpb24gDQoNCmBgYHtyfQ0KUm9vdC5ISDwtUm9vdC5kZkElPiUNCiAgZHBseXI6OmZpbHRlcihOYW1lPT1jKCJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpKSU+JQ0KICBkcGx5cjo6ZmlsdGVyKFRyZW5kPT0iUkIiKQ0KDQpSb290LkhIMTwtUm9vdC5ISCU+JQ0KICBnZ3Bsb3QoYWVzKHg9SVJXLHk9Q2hhbmdlV3QsIGNvbHVyPU5hbWUpKStnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKStteXRoZW1lMw0KYGBgDQoNCmBgYHtyfQ0KUm9vdC5MTDwtUm9vdC5kZkElPiUNCiAgZHBseXI6OmZpbHRlcihOYW1lPT1jKCJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCIpKSU+JQ0KICBkcGx5cjo6ZmlsdGVyKFRyZW5kPT0iUkIiKQ0KDQpSb290LkhILmdyYXBoPC1Sb290LmRmQSU+JQ0KICBkcGx5cjo6ZmlsdGVyKElEPT1jKCJFNUlISEY1IikpJT4lDQogIGdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PVJvb3RXdCkpK2dlb21fbGluZShzaXplPTEuNSkrdGhlbWVfYncoKStteXRoZW1lMw0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9TaW1wbGVFM0hILnBuZyIsIHdpZHRoPTgsIGhlaWdodD00LCBkcGk9NTAwKQ0KYGBgDQojI3JlbW9ibGlzYXRpb24gRE0gYW5kIHN0cnVjdHVyYWwgRE0NCmBgYHtyLGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTh9DQpSb290LkxMMTwtUm9vdC5kZkElPiUNCiAgZHBseXI6OmZpbHRlcihOYW1lPT1jKCJJdmVyc2VuXzEyMURlZm9saWF0aW9uTExGREZENSIpKSU+JQ0KIGRwbHlyOjpmaWx0ZXIoVHJlbmQ9PSJSQiIpDQoNClJvb3QuTEwxYTwtUm9vdC5MTDElPiUNCiAgZ2dwbG90KGFlcyh4PUlSVyx5PUNoYW5nZVd0LCBjb2x1cj1OYW1lKSkrZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrbXl0aGVtZTMNCg0KUmVSb290PC1yYmluZChSb290LkhILFJvb3QuTEwsUm9vdC5MTDEpDQoNCg0KbGlicmFyeShwbHlyKQ0KbG1fZXFuMSA8LSBmdW5jdGlvbihSZVJvb3Qpew0KICBtIDwtIGxtKENoYW5nZVd0fklSVyAsIFJlUm9vdCk7DQogIGVxIDwtIHN1YnN0aXR1dGUoaXRhbGljKHkpID09IElSVyArIENoYW5nZVd0ICUuJSBpdGFsaWMoSVJXKSoiLCJ+fml0YWxpYyhSKV4yfiI9In5yMiwgDQogICAgICAgICAgICAgICAgICAgbGlzdChJUlc9IGZvcm1hdChjb2VmKG0pWzFdLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VXdCA9IGZvcm1hdChjb2VmKG0pWzJdLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICByMiA9IGZvcm1hdChzdW1tYXJ5KG0pJHIuc3F1YXJlZCwgZGlnaXRzID0gMykpKQ0KICBhcy5jaGFyYWN0ZXIoYXMuZXhwcmVzc2lvbihlcSkpOyAgICAgICAgICAgICAgICAgDQp9DQoNCg0KZXFzIDwtIGRkcGx5KFJlUm9vdCwuKFRyZW5kKSxsbV9lcW4xKQ0KDQpSZVJvb3QlPiUNCiAgZ2dwbG90KGFlcyh4PUlSVyx5PUNoYW5nZVd0LCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpK3hsYWIoYnF1b3RlKGJvbGQoJ0ludGlhbCByb290IGJpb21hc3MgKCcqa2d+RE1+aGFeLTEqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1JlbW9ibGlzYXRpb24gbG9zdCAoJyprZ35ETX5oYV4tMSonKScpKSkrDQogIGdlb21fdGV4dChkYXRhID0gZXFzLCBhZXMoeCA9NzAwMCwgeSA9NzAwMCwgbGFiZWwgPSBWMSksIA0KICAgICAgICAgIGNvbG9yID0gJ2JsYWNrJywgIHBhcnNlID0gVFJVRSkrDQogIGdndGl0bGUoIlJlbW9ibGlzYXRpb24gcG90ZW50aWFsIikNCiBkZXRhY2gocGFja2FnZTpwbHlyKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9SZW1vYmxpc2F0aW9uSEwucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQpgYGANCiMjcmVtb2JsaXNhdGlvbiByYXRlDQpgYGB7ciwsZmlnLmhlaWdodD00LCBmaWcud2lkdGg9OH0NClJlUm9vdC5SYXRlPC1SZVJvb3QlPiUNCiAgbXV0YXRlKFJlLnJhdGU9Q2hhbmdlV3QvQ2hhbmdlVHQpJT4lDQogIG11dGF0ZShSZS5yYXRlLlBwPVJlLnJhdGUvQ2hhbmdlUHApDQoNClJlUm9vdC5SYXRlJT4lDQogIGdncGxvdChhZXMoeD1JUlcseT1SZS5yYXRlLCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpDQoNCmBgYA0KDQoNCg0KDQpgYGB7ciwsZmlnLmhlaWdodD00LCBmaWcud2lkdGg9OH0NClJvb3QuTFM8LVJvb3QuZGZBJT4lDQogIGRwbHlyOjpmaWx0ZXIoTmFtZT09YygiSXZlcnNlbl85MURlZm9saWF0aW9uTFMiKSklPiUNCmRwbHlyOjpmaWx0ZXIoVHJlbmQ9PSJSQiIpDQoNClJvb3QuU0w8LVJvb3QuZGZBJT4lDQogIGRwbHlyOjpmaWx0ZXIoTmFtZT09YygiSXZlcnNlbl85MURlZm9saWF0aW9uU0wiKSklPiUNCiAgZHBseXI6OmZpbHRlcihUcmVuZD09IlJCIikNCg0KUm9vdC5TUzwtUm9vdC5kZkElPiUNCiAgZHBseXI6OmZpbHRlcihOYW1lPT1jKCJJdmVyc2VuXzkxRGVmb2xpYXRpb25TUyIpKSU+JQ0KICBkcGx5cjo6ZmlsdGVyKFRyZW5kPT0iUkIiKQ0KDQpSb290LlNTYTwtUm9vdC5kZkElPiUNCiAgZHBseXI6OmZpbHRlcihOYW1lPT1jKCJJdmVyc2VuXzEyMURlZm9saWF0aW9uU1NGREZENSIpKSU+JQ0KICBkcGx5cjo6ZmlsdGVyKFRyZW5kPT0iUkIiKQ0KDQpSb290U1M8LXJiaW5kKFJvb3QuTFMsUm9vdC5TTCxSb290LlNTLFJvb3QuU1NhKQ0KDQoNCmxpYnJhcnkocGx5cikNCmxtX2VxbjEgPC0gZnVuY3Rpb24oUm9vdFNTKXsNCiAgbSA8LSBsbShDaGFuZ2VXdH5JUlcgLCBSb290U1MpOw0KICBlcSA8LSBzdWJzdGl0dXRlKGl0YWxpYyh5KSA9PSBJUlcgKyBDaGFuZ2VXdCAlLiUgaXRhbGljKElSVykqIiwifn5pdGFsaWMoUileMn4iPSJ+cjIsIA0KICAgICAgICAgICAgICAgICAgIGxpc3QoSVJXPSBmb3JtYXQoY29lZihtKVsxXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlV3QgPSBmb3JtYXQoY29lZihtKVsyXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkNCiAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCmVxczEgPC0gZGRwbHkoUm9vdFNTLC4oVHJlbmQpLGxtX2VxbjEpDQoNClJvb3RTUyU+JQ0KICBnZ3Bsb3QoYWVzKHg9SVJXLHk9Q2hhbmdlV3QsIGNvbG9yPUlEKSkrZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrbXl0aGVtZTMreGxhYihicXVvdGUoYm9sZCgnSW50aWFsIHJvb3QgYmlvbWFzcyAoJyprZ35ETX5oYV4tMSonKScpKSkreWxhYihicXVvdGUoYm9sZCgnUmVtb2JsaXNhdGlvbiBsb3N0ICgnKmtnfkRNfmhhXi0xKicpJykpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBlcXMxLCBhZXMoeCA9NDAwMCwgeSA9MjUwMCwgbGFiZWwgPSBWMSksIA0KICAgICAgICAgIGNvbG9yID0gJ2JsYWNrJywgIHBhcnNlID0gVFJVRSkNCiBkZXRhY2gocGFja2FnZTpwbHlyKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9SZW1vYmxpc2F0aW9uc3MucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQoNCmBgYA0KDQojIyMjIw0KDQoNCmBgYHtyfQ0KUm9vdC5kZkExPC1Sb290LmRmQSU+JQ0KICAgICBkcGx5cjo6ZmlsdGVyKFRyZW5kPT0iUkIiKQ0KDQpsaWJyYXJ5KHBseXIpDQpsbV9lcW4xIDwtIGZ1bmN0aW9uKFJvb3QuZGZBMSl7DQogIG0gPC0gbG0oQ2hhbmdlV3R+SVJXICwgUm9vdC5kZkExKTsNCiAgZXEgPC0gc3Vic3RpdHV0ZShpdGFsaWMoeSkgPT0gSVJXICsgQ2hhbmdlV3QgJS4lIGl0YWxpYyhJUlcpKiIsIn5+aXRhbGljKFIpXjJ+Ij0ifnIyLCANCiAgICAgICAgICAgICAgICAgICBsaXN0KElSVz0gZm9ybWF0KGNvZWYobSlbMV0sIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVd0ID0gZm9ybWF0KGNvZWYobSlbMl0sIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gZm9ybWF0KHN1bW1hcnkobSkkci5zcXVhcmVkLCBkaWdpdHMgPSAzKSkpDQogIGFzLmNoYXJhY3Rlcihhcy5leHByZXNzaW9uKGVxKSk7ICAgICAgICAgICAgICAgICANCn0NCg0KDQplcXMxIDwtIGRkcGx5KFJvb3QuZGZBMSwuKFRyZW5kKSxsbV9lcW4xKQ0KDQpSb290LmRmQTElPiUNCiAgZ2dwbG90KGFlcyh4PUlSVyx5PUNoYW5nZVd0LCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzK3hsYWIoYnF1b3RlKGJvbGQoJ0ludGlhbCByb290IGJpb21hc3MgKCcqa2d+RE1+aGFeLTEqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1JlbW9ibGlzYXRpb24gbG9zdCAoJyprZ35ETX5oYV4tMSonKScpKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImRhcmtncmV5IikrDQogIGdlb21fdGV4dChkYXRhID0gZXFzMSwgYWVzKHggPTYwMDAsIHkgPTYwMDAsIGxhYmVsID0gVjEpLCANCiAgICAgICAgICBjb2xvciA9ICdibGFjaycsICBwYXJzZSA9IFRSVUUpDQogZGV0YWNoKHBhY2thZ2U6cGx5cikNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vUmVtb2JsaXNhdGlvbkFMTC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCg0KDQpgYGANCmBgYHtyfQ0KUm9vdC5kZkExPC1Sb290LmRmQSU+JQ0KICAgICBkcGx5cjo6ZmlsdGVyKFRyZW5kPT0iUkIiKSU+JQ0KICBtdXRhdGUoUGVyPUNoYW5nZVd0L0lSVykNCg0KbGlicmFyeShwbHlyKQ0KbG1fZXFuMSA8LSBmdW5jdGlvbihSb290LmRmQTEpew0KICBtIDwtIGxtKFBlcn5JUlcgLCBSb290LmRmQTEpOw0KICBlcSA8LSBzdWJzdGl0dXRlKGl0YWxpYyh5KSA9PSBJUlcgKyBQZXIgJS4lIGl0YWxpYyhJUlcpKiIsIn5+aXRhbGljKFIpXjJ+Ij0ifnIyLCANCiAgICAgICAgICAgICAgICAgICBsaXN0KElSVz0gZm9ybWF0KGNvZWYobSlbMV0sIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIFBlciA9IGZvcm1hdChjb2VmKG0pWzJdLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICByMiA9IGZvcm1hdChzdW1tYXJ5KG0pJHIuc3F1YXJlZCwgZGlnaXRzID0gMykpKQ0KICBhcy5jaGFyYWN0ZXIoYXMuZXhwcmVzc2lvbihlcSkpOyAgICAgICAgICAgICAgICAgDQp9DQoNCg0KZXFzMTEgPC0gZGRwbHkoUm9vdC5kZkExLC4oVHJlbmQpLGxtX2VxbjEpDQoNClJvb3QuZGZBMSU+JQ0KICBnZ3Bsb3QoYWVzKHg9SVJXLHk9UGVyLCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzK3hsYWIoYnF1b3RlKGJvbGQoJ0ludGlhbCByb290IGJpb21hc3MgKCcqa2d+RE1+aGFeLTEqJyknKSkpK3lsYWIoIlJlbW9ibGlzYXRpb24gbG9zdCglKSIpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpKw0KICBnZW9tX3RleHQoZGF0YSA9IGVxczExLCBhZXMoeCA9NjAwMCwgeSA9MC43NSwgbGFiZWwgPSBWMSksIA0KICAgICAgICAgIGNvbG9yID0gJ2JsYWNrJywgIHBhcnNlID0gVFJVRSkNCiBkZXRhY2gocGFja2FnZTpwbHlyKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9SZW1vYmxpc2F0aW9uQUxMcGVyLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KDQoNCmBgYA0KDQoNCg0KYGBge3J9DQpSb290LmRmQTE8LVJvb3QuZGZBJT4lDQogICAgIGRwbHlyOjpmaWx0ZXIoVHJlbmQ9PSJSQiIpDQoNCmxpYnJhcnkocGx5cikNCm15LmZvcm11bGEgIDwtIGZ1bmN0aW9uKFJvb3QuZGZBMSl7DQogIG15LmZvcm11bGEgPC0gQ2hhbmdlV3QgfiBwb2x5KElSVywgMiwgcmF3ID0gVFJVRSkNCiAgbSA8LSBsbShteS5mb3JtdWxhLCBSb290LmRmQTEpDQogIG15LmVxIDwtIGFzLmNoYXJhY3RlcihzaWduaWYoYXMucG9seW5vbWlhbChjb2VmKG0pKSwgMikpDQogIGxhYmVsLnRleHQgPC0gcGFzdGUoInkiLCInPSciLHBhc3RlKGdzdWIoInkiLCAifml0YWxpYyh4KSIsbXkuZXEsIGZpeGVkID0gVFJVRSkpLA0KICAgICAgICAgICAgICBwYXN0ZSgiaXRhbGljKFIpXjIiLGZvcm1hdChzdW1tYXJ5KG0pJHIuc3F1YXJlZCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICBzZXAgPSAifmA9YH4iKSwNCiAgICAgICAgICAgICAgICAgICAgc2VwID0gIn5+fn4iKQ0KICBhcy5jaGFyYWN0ZXIoYXMuZXhwcmVzc2lvbihsYWJlbC50ZXh0KSk7ICAgICAgICAgICAgICAgICANCn0NCg0KbXkuZXFzIDwtIGRkcGx5KFJvb3QuZGZBMSwuKEZEKSxteS5mb3JtdWxhKQ0KDQpiPC1Sb290LmRmQTElPiUNCiAgZ2dwbG90KGFlcyh4PUlSVyx5PUNoYW5nZVd0LCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzK3hsYWIoYnF1b3RlKGJvbGQoJ0ludGlhbCByb290IGJpb21hc3MgKCcqa2d+RE1+aGFeLTEqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1JlbW9ibGlzYXRpb24gbG9zdCAoJyprZ35ETX5oYV4tMSonKScpKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgZm9ybXVsYT15IH4gcG9seSh4LCAyLCByYXc9VFJVRSksIGNvbG91cj0iZGFya2dyZXkiKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQ0KDQpiK2dlb21fdGV4dChkYXRhID0gbXkuZXFzLCBhZXMoeCA9IDYwMDAsIHkgPSA2MDAwLCBsYWJlbCA9IFYxKSwgDQogICAgICAgICAgY29sb3IgPSAnYmxhY2snLCAgcGFyc2UgPSBUUlVFLCBzaXplPTQpDQogIA0KIGRldGFjaChwYWNrYWdlOnBseXIpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvUmVtb2JsaXNhdGlvbkFMTHBsb3kyLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KDQoNCmBgYA0KYGBge3J9DQpSb290LmRmQTE8LVJvb3QuZGZBJT4lDQogICAgIGRwbHlyOjpmaWx0ZXIoVHJlbmQ9PSJSQiIpDQoNCmxpYnJhcnkocGx5cikNCm15LmZvcm11bGEgIDwtIGZ1bmN0aW9uKFJvb3QuZGZBMSl7DQogIG15LmZvcm11bGEgPC0gQ2hhbmdlV3QgfiBwb2x5KElSVywgMywgcmF3ID0gVFJVRSkNCiAgbSA8LSBsbShteS5mb3JtdWxhLCBSb290LmRmQTEpDQogIG15LmVxIDwtIGFzLmNoYXJhY3RlcihzaWduaWYoYXMucG9seW5vbWlhbChjb2VmKG0pKSwgMikpDQogIGxhYmVsLnRleHQgPC0gcGFzdGUoInkiLCInPSciLHBhc3RlKGdzdWIoInkiLCAifml0YWxpYyh4KSIsbXkuZXEsIGZpeGVkID0gVFJVRSkpLA0KICAgICAgICAgICAgICBwYXN0ZSgiaXRhbGljKFIpXjIiLGZvcm1hdChzdW1tYXJ5KG0pJHIuc3F1YXJlZCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICBzZXAgPSAifmA9YH4iKSwNCiAgICAgICAgICAgICAgICAgICAgc2VwID0gIn5+fn4iKQ0KICBhcy5jaGFyYWN0ZXIoYXMuZXhwcmVzc2lvbihsYWJlbC50ZXh0KSk7ICAgICAgICAgICAgICAgICANCn0NCg0KbXkuZXFzIDwtIGRkcGx5KFJvb3QuZGZBMSwuKEZEKSxteS5mb3JtdWxhKQ0KDQpiPC1Sb290LmRmQTElPiUNCiAgZ2dwbG90KGFlcyh4PUlSVyx5PUNoYW5nZVd0LCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzK3hsYWIoYnF1b3RlKGJvbGQoJ0ludGlhbCByb290IGJpb21hc3MgKCcqa2d+RE1+aGFeLTEqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1JlbW9ibGlzYXRpb24gbG9zdCAoJyprZ35ETX5oYV4tMSonKScpKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgZm9ybXVsYT15IH4gcG9seSh4LCAzLCByYXc9VFJVRSksIGNvbG91cj0iZGFya2dyZXkiKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQ0KDQpiK2dlb21fdGV4dChkYXRhID0gbXkuZXFzLCBhZXMoeCA9IDY4MDAsIHkgPSA2MDAwLCBsYWJlbCA9IFYxKSwgDQogICAgICAgICAgY29sb3IgPSAnYmxhY2snLCAgcGFyc2UgPSBUUlVFLCBzaXplPTQpDQogIA0KIGRldGFjaChwYWNrYWdlOnBseXIpDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvL1JlbW9ibGlzYXRpb25BTExwbG95My5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCg0KDQpgYGANCg0KDQoNCiMjcmVtb2JsaXNhdGlvbiByYXRlDQpgYGB7cn0NClJvb3QuZGZBTEw8LVJvb3QuZGZBMSU+JQ0KICBtdXRhdGUoUmUucmF0ZT1DaGFuZ2VXdC9DaGFuZ2VUdCklPiUNCiAgbXV0YXRlKFJlLnJhdGUuUHA9UmUucmF0ZS9DaGFuZ2VQcCkNCg0KbGlicmFyeShwbHlyKQ0KbG1fZXFuMSA8LSBmdW5jdGlvbihSb290LmRmQUxMKXsNCiAgbSA8LSBsbShSZS5yYXRlfklSVyAsIFJvb3QuZGZBTEwpOw0KICBlcSA8LSBzdWJzdGl0dXRlKGl0YWxpYyh5KSA9PSBJUlcgKyBSZS5yYXRlICUuJSBpdGFsaWMoSVJXKSoiLCJ+fml0YWxpYyhSKV4yfiI9In5yMiwgDQogICAgICAgICAgICAgICAgICAgbGlzdChJUlc9IGZvcm1hdChjb2VmKG0pWzFdLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBSZS5yYXRlID0gZm9ybWF0KGNvZWYobSlbMl0sIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gZm9ybWF0KHN1bW1hcnkobSkkci5zcXVhcmVkLCBkaWdpdHMgPSAzKSkpDQogIGFzLmNoYXJhY3Rlcihhcy5leHByZXNzaW9uKGVxKSk7ICAgICAgICAgICAgICAgICANCn0NCg0KDQplcXMxMSA8LSBkZHBseShSb290LmRmQUxMLC4oVHJlbmQpLGxtX2VxbjEpDQoNClJvb3QuZGZBTEwlPiUNCmdncGxvdChhZXMoeD1JUlcseT1SZS5yYXRlLCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzKw0KICB4bGFiKGJxdW90ZShib2xkKCdJbnRpYWwgcm9vdCBiaW9tYXNzICgnKmtnfmhhXi0xKicpJykpKSt5bGFiKGJxdW90ZShib2xkKCdSZW1vYmxpc2F0aW9uICByYXRlICgnKmtnfmNkXi0xKicpJykpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBlcXMxMSwgYWVzKHggPTYwMDAsIHkgPTQsIGxhYmVsID0gVjEpLCANCiAgICAgICAgICBjb2xvciA9ICdibGFjaycsICBwYXJzZSA9IFRSVUUpDQogZGV0YWNoKHBhY2thZ2U6cGx5cikNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vUmVtb2JsaXNhdGlvbiByYXRlLnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KDQoNCmBgYA0KDQojIyMjcm9vdCByZXNwaXJhdGlvbiByYXRlIFNTDQpgYGB7cixmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD04fQ0KUm9vdFNTLlJhdGU8LVJvb3RTUyU+JQ0KICBtdXRhdGUoUmUucmF0ZT1DaGFuZ2VXdC9DaGFuZ2VUdCklPiUNCiAgbXV0YXRlKFJlLnJhdGUuUHA9UmUucmF0ZS9DaGFuZ2VQcCkNCg0KUm9vdFNTLlJhdGUlPiUNCiAgZ2dwbG90KGFlcyh4PUlSVyx5PVJlLnJhdGUsIGNvbG9yPUlEKSkrZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImRhcmtncmV5IikNCg0KYGBgDQoNCg0KIyMjd2hlbiBwYXJ0aXRpb25pbmcgc3RhcnQ/IFBwDQoNCmBgYHtyfQ0KUm9vdC5QVDwtUm9vdC5kZkElPiUNCiAgZmlsdGVyKFRyZW5kPT0iUFQiKSU+JQ0KICBtdXRhdGUoUHQucmF0ZT1DaGFuZ2VXdC9DaGFuZ2VUdCklPiUNCiAgbXV0YXRlKFB0LnJhdGUuUHA9UHQucmF0ZS9DaGFuZ2VQcCklPiUNCiAgbXV0YXRlKFBUUj1DaGFuZ2VXdC9JUlcpDQoNCg0KbGlicmFyeShwbHlyKQ0KbG1fZXFuMSA8LSBmdW5jdGlvbihSb290LlBUKXsNCiAgbSA8LSBsbShIUld+SVJXICwgUm9vdC5QVCk7DQogIGVxIDwtIHN1YnN0aXR1dGUoaXRhbGljKHkpID09IElSVysgSFJXICUuJSBpdGFsaWMoSVJXKSoiLCJ+fml0YWxpYyhSKV4yfiI9In5yMiwgDQogICAgICAgICAgICAgICAgICAgbGlzdChJUlc9IGZvcm1hdChjb2VmKG0pWzFdLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBIUlcgPSBmb3JtYXQoY29lZihtKVsyXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkNCiAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCmVxczEyIDwtIGRkcGx5KFJvb3QuUFQsLihUcmVuZCksbG1fZXFuMSkNCg0KUm9vdC5QVCU+JQ0KICBnZ3Bsb3QoYWVzKHg9SVJXLHk9SFJXLCBjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpK215dGhlbWUzK2dndGl0bGUoIlJlY2hhcmdpbmcgcG90ZW50aWFsICIpKw0KICB4bGFiKGJxdW90ZShib2xkKCdJbml0YWwgcm9vdCBiaW9tYXNzICgnKmtnfmhhXi0xKicpJykpKSt5bGFiKGJxdW90ZShib2xkKCdNYXhpbXVtIHJvb3QgYm9tYXNzICgnKmtnfmhhXi0xKicpJykpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBlcXMxMiwgYWVzKHggPTQwMDAsIHkgPTg4MDAsIGxhYmVsID0gVjEpLCANCiAgICAgICAgICBjb2xvciA9ICdibGFjaycsICBwYXJzZSA9IFRSVUUpDQogZGV0YWNoKHBhY2thZ2U6cGx5cikNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vUmVjaGFuZ2luZyBwb3RlbnRpYWwucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQoNCmBgYA0KIyMjd2hlbiBwYXJ0aXRpb25pbmcgc3RhcnQ/IFBwDQojIyNSZWNoYXJnaW5nIHJhdGUNCmBgYHtyfQ0KUm9vdC5QVDwtUm9vdC5kZkElPiUNCiAgZmlsdGVyKFRyZW5kPT0iUFQiKSU+JQ0KICBtdXRhdGUoUHQucmF0ZT1DaGFuZ2VXdC9DaGFuZ2VUdCklPiUNCiAgbXV0YXRlKFB0LnJhdGUuUHA9UHQucmF0ZS9DaGFuZ2VQcCklPiUNCiAgbXV0YXRlKFBUUj1DaGFuZ2VXdC9JUlcpDQoNCg0KbGlicmFyeShwbHlyKQ0KbG1fZXFuMSA8LSBmdW5jdGlvbihSb290LlBUKXsNCiAgbSA8LSBsbShIUld+UHQucmF0ZSAsIFJvb3QuUFQpOw0KICBlcSA8LSBzdWJzdGl0dXRlKGl0YWxpYyh5KSA9PSBQdC5yYXRlKyBIUlcgJS4lIGl0YWxpYyhQdC5yYXRlKSoiLCJ+fml0YWxpYyhSKV4yfiI9In5yMiwgDQogICAgICAgICAgICAgICAgICAgbGlzdChQdC5yYXRlPSBmb3JtYXQoY29lZihtKVsxXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgSFJXID0gZm9ybWF0KGNvZWYobSlbMl0sIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gZm9ybWF0KHN1bW1hcnkobSkkci5zcXVhcmVkLCBkaWdpdHMgPSAzKSkpDQogIGFzLmNoYXJhY3Rlcihhcy5leHByZXNzaW9uKGVxKSk7ICAgICAgICAgICAgICAgICANCn0NCg0KDQplcXMxMiA8LSBkZHBseShSb290LlBULC4oVHJlbmQpLGxtX2VxbjEpDQoNClJvb3QuUFQlPiUNCiAgZ2dwbG90KGFlcyh4PVB0LnJhdGUseT1IUlcsIGNvbG9yPUlEKSkrZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrbXl0aGVtZTMrZ2d0aXRsZSgiUmVjaGFyZ2luZyByYXRlICIpKw0KICB4bGFiKGJxdW90ZShib2xkKCdSZWNoYXJnaW5nIHJhdGUgKCcqa2d+Y2ReLTEqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ01heGltdW0gcm9vdCBib21hc3MgKCcqa2d+aGFeLTEqJyknKSkpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpKw0KICBnZW9tX3RleHQoZGF0YSA9IGVxczEyLCBhZXMoeCA9MiwgeSA9ODgwMCwgbGFiZWwgPSBWMSksIA0KICAgICAgICAgIGNvbG9yID0gJ2JsYWNrJywgIHBhcnNlID0gVFJVRSkNCiBkZXRhY2gocGFja2FnZTpwbHlyKQ0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9SZWNoYW5naW5nIHJhdGUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQoNCmBgYA0KDQoNCg0KIyMjUm9vdFBUIGluIExMIGFuZCBISA0KYGBge3J9DQpSb290LlBUTEg8LVJvb3QuUFQlPiUNCiAgZHBseXI6OmZpbHRlcihJRCE9IkUzSUxMIiklPiUNCiAgZHBseXI6OmZpbHRlcihJRCE9IkU1SUxMRjUiKSU+JSANCiAgZHBseXI6OmZpbHRlcihJRCE9IkU1SUhIRjUiKQ0KUm9vdC5QVExIJT4lDQogIGdncGxvdChhZXMoeD1JUlcseT1DaGFuZ2VXdCwgY29sb3I9SUQpKStnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKStteXRoZW1lMytnZ3RpdGxlKCJSZWNoYXJnaW5nIHBvdGVudGlhbCIpDQogICNnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpDQoNCmBgYA0KDQpgYGB7cn0NClJvb3QuUFRMSCU+JQ0KICBnZ3Bsb3QoYWVzKHg9SVJXLHk9UHQucmF0ZSwgY29sb3I9SUQpKStnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKStteXRoZW1lMytnZ3RpdGxlKCJSZWNoYXJnaW5nIHBvdGVudGlhbCIpDQogICNnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpDQpgYGANCg0KIyMjUmVzcGlyYXRpb24gUmF0ZSBhbmQgaW50aWFsIGJpb21hc3MNCg0KYGBge3IsZmlnLmhlaWdodD00LCBmaWcud2lkdGg9OH0NClJvb3QuZGZSPC1Sb290LmRmQSU+JQ0KICBmaWx0ZXIoVHJlbmQ9PSJSUCIpJT4lDQogIG11dGF0ZShSUC5yYXRlPUNoYW5nZVd0L0NoYW5nZVR0KSU+JQ0KICBtdXRhdGUoR3Jvd3RoUm90YXRpb249cGFzdGUoR3Jvd3RoU2Vhc29uLFJvdGF0aW9uKSkNCg0KbGlicmFyeShwbHlyKQ0KbG1fZXFuMSA8LSBmdW5jdGlvbihSb290LmRmUil7DQogIG0gPC0gbG0oUlAucmF0ZX5JUlcgLCBSb290LmRmUik7DQogIGVxIDwtIHN1YnN0aXR1dGUoaXRhbGljKHkpID09IElSVysgUlAucmF0ZSAlLiUgaXRhbGljKFJQLnJhdGUpKiIsIn5+aXRhbGljKFIpXjJ+Ij0ifnIyLCANCiAgICAgICAgICAgICAgICAgICBsaXN0KElSVz0gZm9ybWF0KGNvZWYobSlbMV0sIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIFJQLnJhdGUgPSBmb3JtYXQoY29lZihtKVsyXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkNCiAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCmVxczEyIDwtIGRkcGx5KFJvb3QuZGZSLC4oVHJlbmQpLGxtX2VxbjEpDQoNCmRldGFjaChwYWNrYWdlOnBseXIpDQoNClJvb3QuZGZSJT4lDQogIGdncGxvdChhZXMoeD1JUlcsIHk9UlAucmF0ZSxjb2xvcj1JRCxsYWJlbD1Hcm93dGhSb3RhdGlvbikpK2dlb21fdGV4dCgpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIHhsYWIoYnF1b3RlKGJvbGQoJ0ludGlhbCByb290IGJpb21hc3MgKCcqa2d+RE1+aGFeLTEqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1JlcGlyYXRpb24gcmF0ZSAoJyprZ35DZF4tMSonKScpKSkrZ2d0aXRsZSgiUmVzcGlyYXRpb24gaW4gV2ludGVyIikrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImRhcmtncmV5IikrDQogIGdlb21fdGV4dChkYXRhID0gZXFzMTIsIGFlcyh5PTYsIHggPTUwMDAsIGxhYmVsID0gVjEpLA0KICAgICAgICAgIGNvbG9yID0gJ2JsYWNrJywgIHBhcnNlID0gVFJVRSkNCg0KIGdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9SZXNwaWFydGlvbiByYXRlLnBuZyIsIHdpZHRoPTgsIGhlaWdodD00LCBkcGk9NTAwKQ0KIHdyaXRlLmNzdihSb290LmRmUiwiRDovUi9SZXNwaXJhdGlvbi9Sb290LmRmUi5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkNCiAgDQpgYGANCg0KIyMjcmVzcGlyYXRpb24gYW5kIHN0cnVjdHVyYWwgcm9vdCBiaW9tYXNzDQojIyNzdHJ1Y3R1cmFsIHJvb3QgaXMgcGVyY2VudGFnZSBvZiB0b3RhbCByb290IGJpb21hc3MNCmBgYHtyfQ0KUm9vdC5kZnBlcjwtUm9vdC5kZkElPiUNCiAgZmlsdGVyKFRyZW5kPT0iUlAiKSU+JQ0KICBtdXRhdGUoUGVyPTEtQ2hhbmdlVHQvSVJXKSU+JQ0KICAgbXV0YXRlKEdyb3d0aFJvdGF0aW9uPWFzLmZhY3RvcihwYXN0ZShHcm93dGhTZWFzb24sUm90YXRpb24pKSklPiUNCiAgZHBseXI6OmZpbHRlcihHcm93dGhTZWFzb24hPSIyInxSb3RhdGlvbiE9IjEwIikNCg0KbGlicmFyeShwbHlyKQ0KbG1fZXFuMTEgPC0gZnVuY3Rpb24oUm9vdC5kZnBlcil7DQogIG0gPC0gbG0oQ2hhbmdlV3R+SVJXICwgUm9vdC5kZnBlcik7DQogIGVxIDwtIHN1YnN0aXR1dGUoaXRhbGljKHkpID09IElSVysgQ2hhbmdlV3QgJS4lIGl0YWxpYyhDaGFuZ2VXdCkqIiwifn5pdGFsaWMoUileMn4iPSJ+cjIsIA0KICAgICAgICAgICAgICAgICAgIGxpc3QoSVJXPSBmb3JtYXQoY29lZihtKVsxXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlV3QgPSBmb3JtYXQoY29lZihtKVsyXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkNCiAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCmVxczEzIDwtIGRkcGx5KFJvb3QuZGZwZXIsLihUcmVuZCksbG1fZXFuMTEpDQoNCmRldGFjaChwYWNrYWdlOnBseXIpDQoNClJvb3QuZGZwZXIlPiUNCiAgZ2dwbG90KGFlcyh4PUlSVywgeT1DaGFuZ2VXdCxjb2xvcj1JRCxsYWJlbD1Hcm93dGhSb3RhdGlvbikpK2dlb21fdGV4dCgpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIHhsYWIoYnF1b3RlKGJvbGQoJ0luaXRpYWwgcm9vdCBiaW9tYXNzICgnKmtnfmhhXi0xKicpJykpKSt5bGFiKGJxdW90ZShib2xkKCdSb290IHJlc3BpcmF0aW9uICgnKmtnfmhhXi0xKicpJykpKStnZ3RpdGxlKCJSZXNwaXJhdGlvbiBpbiBXaW50ZXIiKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBlcXMxMywgYWVzKHk9MjAwMCwgeCA9NjAwMCwgbGFiZWwgPSBWMSksDQogICAgICAgICAgY29sb3IgPSAnYmxhY2snLCAgcGFyc2UgPSBUUlVFKQ0KDQogZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL3Jvb3RzdHVyY3R1cmFsLnBuZyIsIHdpZHRoPTgsIGhlaWdodD00LCBkcGk9NTAwKQ0KICN3cml0ZS5jc3YoUm9vdC5kZlIsIkQ6L1IvUmVzcGlyYXRpb24vUm9vdC5kZlIuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpDQoNCiAjIyNzdHJ1Y3R1cmFsIHJvb3QgYmlvbWFzcz0yNDkxLjMwDQoNCmBgYA0KDQojIyMgZGFpbHkgd2ludGVyIHJlc3BpcmF0aW9uIA0KYGBge3IsLGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTh9DQp1cERpciA8LSAiRDovUi8iDQpSb290ZGYgPC0gIkQ6L1IvUmVzcGlyYXRpb24vIg0KDQpSb290UmVzcDwtIHJlYWQudGFibGUocGFzdGUwKFJvb3RkZiwgIlJvb3RSZXNwLnR4dCIpLA0KICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkNClJvb3QucmVzcCA8LSBSb290UmVzcCAlPiUgbXV0YXRlKENsb2NrLlRvZGF5PWRteShDbG9jay5Ub2RheSkpJT4lDQogIGZpbHRlcihGaW5pYWxSVyE9Ik5BIiklPiUNCiAgZHBseXI6OnNlbGVjdChOYW1lLENsb2NrLlRvZGF5LFRlYXJ0aCxHcm93dGhSb3RhdGlvbixGaW5pYWxSVyxSbV9yb290X2RheTEsUm1fcm9vdF9kYXkyLFJtX3Jvb3RfZGF5MywgUm1fcm9vdF9kYXk0LCBSbV9yb290X2RheTUsUm1fcm9vdF9kYXk2LFJtX3Jvb3RfZGF5NyxSbV9yb290X2RheTgsUm1fcm9vdF9kYXk5LFJtX3Jvb3RfZGF5MTApICU+JQ0KICB0aWR5cjo6Z2F0aGVyKCJWYXJpYWJsZSIsIlByZWRpY3RlZCIsUm1fcm9vdF9kYXkxOlJtX3Jvb3RfZGF5MTApDQogICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fOTFEZWZvbGlhdGlvbkxMInxHcm93dGhSb3RhdGlvbiE9IjMxIikNCiAgI2ZpbHRlcihOYW1lIT0iSXZlcnNlbl8xMjFEZWZvbGlhdGlvbkhIRkRGRDUiKQ0KDQpSb290LnJlc3AkVmFyaWFibGU8LSBmYWN0b3IoUm9vdC5yZXNwJFZhcmlhYmxlLCBsZXZlbHM9YygiUm1fcm9vdF9kYXkxIiwgIlJtX3Jvb3RfZGF5MiIsICJSbV9yb290X2RheTMiLCAiUm1fcm9vdF9kYXk0IiwgIlJtX3Jvb3RfZGF5NSIsIlJtX3Jvb3RfZGF5NiIsICJSbV9yb290X2RheTciLCJSbV9yb290X2RheTgiLCJSbV9yb290X2RheTkiLCJSbV9yb290X2RheTEwIikpDQpSb290LnJlc3AlPiUNCiAgZ2dwbG90KGFlcyh4PUZpbmlhbFJXLCB5PSBQcmVkaWN0ZWQsIGNvbG91cj0gZmFjdG9yKE5hbWUpKSkgKw0KICBnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkgKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDEpKw0KICBnZ3RpdGxlKCJSb290IGJpb21hc3MiKSsNCiAgZmFjZXRfd3JhcCh+VmFyaWFibGUsIG5jb2wgPSA0KSsNCiAgdGhlbWVfYncoKStteXRoZW1lMysNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwMCw4MDAwLCBieSA9MzAwMCksIGxpbWl0cz1jKDAsODAwMCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDAsIDYwMDAsIGJ5ID0yMDAwKSwgbGltaXRzPWMoMCw4MDAwKSkrDQogIHlsYWIoIlByZWRpY3RlZCIpK3hsYWIoIk9ic2VydmVkIikrZ2d0aXRsZSgiUmVzcGlyYXRpb24gaW4gV2ludGVyIikrIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikNCiBnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvUm1fcm9vdF9kYXkucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTgsIGRwaT01MDApDQpgYGANCiMjIERlZmluZSBzdGF0cyBmdW5jdGlvbg0KDQoqIFVzaW5nIEdhdWNoIGV0IGFsLiAyMDAzIChNb2RlbCBldmFsdWF0aW9uIGJ5IGNvbXBhcmlzb24gb2YgbW9kZWwtYmFzZWQgcHJlZGljdGlvbnMgYW5kIG1lYXN1cmVkIHZhbHVlcy4gQWdyb24uIEouIDk1LCAxNDQyLTE0NDYpIA0KYGBge3IgU3RhdHMsIGluY2x1ZGUgPSBUUlVFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD04fQ0KDQojICMgUjINCiMgdGVzdERGIDwtIGRhdGEuZnJhbWUoYT1jKDEsMiwzLDQsNSksIGI9YygxMCwyMCwxMCw0MCw1MCkpDQojIA0KIyBteVIyIDwtIGZ1bmN0aW9uKHAsbykgew0KIyAgcmV0dXJuKHN1bW1hcnkobG0ocH5vLCBuYS5hY3Rpb249bmEuZXhjbHVkZSkpJHIuc3F1YXJlZCkgDQojIH0NCiMgDQojIHRlc3RERiAlPiUNCiMgICBzdW1tYXJpc2UodGhpc1IyID0gbXlSMihhLGIpKQ0KDQojIGdhdWNoIE1TRSBjb21wb25lbnRzDQpnYXVjaFN0YXRzIDwtIGZ1bmN0aW9uKHNpbSwgbWVhcykgew0KDQogIG5fcyA8LSBsZW5ndGgoc2ltKQ0KICBuX20gPC0gbGVuZ3RoKG1lYXMpDQogIG1vZGVsIDwtIGxtKG1lYXN+c2ltKQ0KICBzaW1fc3EgPC0gc3VtKChzaW0gLSBtZWFuKHNpbSkpXjIpDQogIG1lc19zcSA8LSBzdW0oKG1lYXMgLSBtZWFuKG1lYXMpKV4yKQ0KICByMiA8LSBzdW1tYXJ5KG1vZGVsKSRyLnNxdWFyZWQNCiAgc2xvcGUgPC0gbW9kZWwkY29lZmZpY2llbnRzW1syXV0NCg0KICBzYiA8LSAoc3VtKG1lYW4obWVhcykpIC0gc3VtKG1lYW4oc2ltKSkpXjINCiAgbnUgPC0gKDEtc2xvcGUpXjIgKiAoc2ltX3NxL25fcykNCiAgbGMgPC0gKDEtcjIpICogKG1lc19zcS9uX20pDQogIG1zZCA8LSBzYitudStsYw0KDQogIHNiX3IgPC0gcm91bmQoKHNiL21zZCkqMTAwLDEpDQogIG51X3IgPC0gcm91bmQoKG51L21zZCkqMTAwLDEpDQogIGxjX3IgPC0gcm91bmQoKGxjL21zZCkqMTAwLDEpDQoNCiAgbXNkX3IgPC0gc2JfcitudV9yK2xjX3INCg0KICAjIHNlbGVjdCB3aGljaCB2YXJpYWJsZXMgdG8gb3V0cHV0DQogIG91dCA8LSBjKHNiX3IsbnVfcixsY19yLCBtc2Rfciwgcm91bmQocjIqMTAwLDEpKQ0KDQogIHJldHVybihvdXQpDQoNCn0NCmBgYA0KDQojIyBUZXN0IHN0YXRzIGZ1bmN0aW9ucyB1c2VkDQoNCmBgYHtyfQ0KcyA8LSBjKDQyMzEuOTcyLDM5MzUuNjA0LDM3NzkuNjUyLDM2MjcuNjg3LDMzNjMuNDk5LDMyMzAuNTY2LDI4NjguMTE0LDI4NjguODI3KQ0KbSA8LSBjKDQ5ODcuNjYsNTYzNi4wOSw0NzU0LjA2LDQxMTQuNTMsNDE0MS43MiwzNzA0LjA2LDUxNDIuMTksNDc2Mi4wMykNCg0KeCA8LSBnYXVjaFN0YXRzKHMsbSkNCg0KdGVtcERmIDwtIGRhdGEuZnJhbWUoc3RhdE5hbWU9YygiU0IiLCJOVSIsIkxDIiwicl9NU0QiLCJSMiIpLCBzdGF0VmFsdWU9eCkNCiMga2FibGUodGVtcERmLCBkaWdpdHM9IDIpDQp0ZW1wRGYyIDwtIGRhdGEuZnJhbWUoUHJlZGljdGVkPXMsIE9ic2VydmVkPW0pDQoNCnggPC0gdGVtcERmMiAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgcjIgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbNV0sDQogICMgIHJtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCksMCksDQogICAgcl9ybXNlID0gcm91bmQocm1zZShQcmVkaWN0ZWQsT2JzZXJ2ZWQpL21lYW4oT2JzZXJ2ZWQpKjEwMCwxKSwNCiAgICBuc2UgPSByb3VuZChOU0UoUHJlZGljdGVkLE9ic2VydmVkKSwxKSwNCiAgICBzYiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsxXSwNCiAgbnUgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbMl0sDQogIGxjID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzNdDQogICkgJT4lIA0KICB0KCkgDQoNCmRmIDwtIGRhdGEuZnJhbWUoc3RhdCA9IHJvdy5uYW1lcyh4KSxzdGF0dmFsdWUgPSB4WywxXSkNCg0KZGYgJT4lDQogIGthYmxlKGZvcm1hdCA9ICJtYXJrZG93biIpDQpgYGANCg0KYGBge3J9DQpSb290LnJlc3AkVmFyaWFibGU8LSBmYWN0b3IoUm9vdC5yZXNwJFZhcmlhYmxlLCBsZXZlbHM9YygiUm1fcm9vdF9kYXkxIiwgIlJtX3Jvb3RfZGF5MiIsICJSbV9yb290X2RheTMiLCAiUm1fcm9vdF9kYXk0IiwgIlJtX3Jvb3RfZGF5NSIsIlJtX3Jvb3RfZGF5NiIsICJSbV9yb290X2RheTciLCJSbV9yb290X2RheTgiLCJSbV9yb290X2RheTkiLCJSbV9yb290X2RheTEwIikpDQpSb290LnJlc3AgJT4lDQogIG11dGF0ZShPYnNlcnZlZD1GaW5pYWxSVyklPiUNCiAgICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZERkQ1IiklPiUNCiAgZ3JvdXBfYnkoVmFyaWFibGUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbiA9IG4oKSwNCiAgICByMiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVs1XSwNCiAgIyAgcm1zZSA9IHJvdW5kKHJtc2UoUHJlZGljdGVkLE9ic2VydmVkKSwwKSwNCiAgICByX3Jtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCkvbWVhbihPYnNlcnZlZCkqMTAwLDEpLA0KICAgIG5zZSA9IHJvdW5kKE5TRShQcmVkaWN0ZWQsT2JzZXJ2ZWQpLDEpLA0KICAgIHNiID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzFdLA0KICBudSA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsyXSwNCiAgbGMgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbM10NCiAgKSANCiMjIzE9MC4wMTMsMC4wMTUsIDAuMDIsIDAuMDI1LDAuMDI4LCAwLjAzLCAwLjAzNSwwLjA0LCgwLjA0NSksMC4wNQ0KDQpgYGANCg0KIyMjIGRhaWx5IHdpbnRlciByZXNwaXJhdGlvbiB3aXRoIHN0cnVjdHVyYWwgcm9vdCBiaW9tYXNzDQpgYGB7ciwsZmlnLmhlaWdodD04LCBmaWcud2lkdGg9OH0NCnVwRGlyIDwtICJEOi9SLyINClJvb3RkZiA8LSAiRDovUi9SZXNwaXJhdGlvbi8iDQoNClJvb3RSZXNwPC0gcmVhZC50YWJsZShwYXN0ZTAoUm9vdGRmLCAiUm9vdFJlc3BTdHJ1LnR4dCIpLA0KICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkNClJvb3QucmVzcC5zdHJ1IDwtIFJvb3RSZXNwICU+JSBtdXRhdGUoQ2xvY2suVG9kYXk9ZG15KENsb2NrLlRvZGF5KSklPiUNCiAgZmlsdGVyKEZpbmlhbFJXIT0iTkEiKSU+JQ0KICBkcGx5cjo6c2VsZWN0KE5hbWUsQ2xvY2suVG9kYXksVGVhcnRoLEdyb3d0aFJvdGF0aW9uLEZpbmlhbFJXLFJtX3Jvb3RfZGF5MSxSbV9yb290X2RheTIsUm1fcm9vdF9kYXkzLCBSbV9yb290X2RheTQsIFJtX3Jvb3RfZGF5NSxSbV9yb290X2RheTYsUm1fcm9vdF9kYXk3LFJtX3Jvb3RfZGF5OCxSbV9yb290X2RheTksUm1fcm9vdF9kYXkxMCxSbV9yb290X2RheTExLFJtX3Jvb3RfZGF5MTIsUm1fcm9vdF9kYXkxMyxSbV9yb290X2RheTE0LFJtX3Jvb3RfZGF5MTUsUm1fcm9vdF9kYXkxNixSbV9yb290X2RheTE3LFJtX3Jvb3RfZGF5MTgsUm1fcm9vdF9kYXkxOSxSbV9yb290X2RheTIwKSAlPiUNCiAgdGlkeXI6OmdhdGhlcigiVmFyaWFibGUiLCJQcmVkaWN0ZWQiLFJtX3Jvb3RfZGF5MTpSbV9yb290X2RheTIwKQ0KICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCJ8R3Jvd3RoUm90YXRpb24hPSIzMSIpDQogICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZERkQ1IikNCg0KUm9vdC5yZXNwLnN0cnUkVmFyaWFibGU8LSBmYWN0b3IoUm9vdC5yZXNwLnN0cnUkVmFyaWFibGUsIGxldmVscz1jKCJSbV9yb290X2RheTEiLCAiUm1fcm9vdF9kYXkyIiwgIlJtX3Jvb3RfZGF5MyIsICJSbV9yb290X2RheTQiLCAiUm1fcm9vdF9kYXk1IiwiUm1fcm9vdF9kYXk2IiwgIlJtX3Jvb3RfZGF5NyIsIlJtX3Jvb3RfZGF5OCIsIlJtX3Jvb3RfZGF5OSIsIlJtX3Jvb3RfZGF5MTAiLCJSbV9yb290X2RheTExIiwiUm1fcm9vdF9kYXkxMiIsIlJtX3Jvb3RfZGF5MTMiLCJSbV9yb290X2RheTE0IiwiUm1fcm9vdF9kYXkxNSIsIlJtX3Jvb3RfZGF5MTYiLCJSbV9yb290X2RheTE3IiwiUm1fcm9vdF9kYXkxOCIsIlJtX3Jvb3RfZGF5MTkiLCJSbV9yb290X2RheTIwIikpDQpSb290LnJlc3Auc3RydSU+JQ0KICBnZ3Bsb3QoYWVzKHg9RmluaWFsUlcsIHk9IFByZWRpY3RlZCwgY29sb3VyPSBmYWN0b3IoTmFtZSkpKSArDQogIGdlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxKSArDQogIGNvb3JkX2ZpeGVkKHJhdGlvID0gMSkrDQogIGdndGl0bGUoIlJvb3QgYmlvbWFzcyIpKw0KICBmYWNldF93cmFwKH5WYXJpYWJsZSwgbmNvbCA9IDUpKw0KICB0aGVtZV9idygpK215dGhlbWUzKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDAwLDgwMDAsIGJ5ID0zMDAwKSwgbGltaXRzPWMoMCw4MDAwKSkrDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwMCwgNjAwMCwgYnkgPTIwMDApLCBsaW1pdHM9YygwLDgwMDApKSsNCiAgeWxhYigiUHJlZGljdGVkIikreGxhYigiT2JzZXJ2ZWQiKStnZ3RpdGxlKCJSZXNwaXJhdGlvbiBpbiBXaW50ZXIiKSsgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KIGdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9SbV9yb290X2RheVN0cnUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTEwLCBkcGk9NTAwKQ0KYGBgDQojIyNhbmFseXNpcw0KYGBge3J9DQpSb290LnJlc3Auc3RydSRWYXJpYWJsZTwtIGZhY3RvcihSb290LnJlc3Auc3RydSRWYXJpYWJsZSwgbGV2ZWxzPWMoIlJtX3Jvb3RfZGF5MSIsICJSbV9yb290X2RheTIiLCAiUm1fcm9vdF9kYXkzIiwgIlJtX3Jvb3RfZGF5NCIsICJSbV9yb290X2RheTUiLCJSbV9yb290X2RheTYiLCAiUm1fcm9vdF9kYXk3IiwiUm1fcm9vdF9kYXk4IiwiUm1fcm9vdF9kYXk5IiwiUm1fcm9vdF9kYXkxMCIsIlJtX3Jvb3RfZGF5MTEiLCJSbV9yb290X2RheTEyIiwiUm1fcm9vdF9kYXkxMyIsIlJtX3Jvb3RfZGF5MTQiLCJSbV9yb290X2RheTE1IiwiUm1fcm9vdF9kYXkxNiIsIlJtX3Jvb3RfZGF5MTciLCJSbV9yb290X2RheTE4IiwiUm1fcm9vdF9kYXkxOSIsIlJtX3Jvb3RfZGF5MjAiKSkNClJvb3QucmVzcC5zdHJ1ICU+JQ0KICBtdXRhdGUoT2JzZXJ2ZWQ9RmluaWFsUlcpJT4lDQogICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpJT4lDQogIGdyb3VwX2J5KFZhcmlhYmxlKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgcjIgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbNV0sDQogICMgIHJtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCksMCksDQogICAgcl9ybXNlID0gcm91bmQocm1zZShQcmVkaWN0ZWQsT2JzZXJ2ZWQpL21lYW4oT2JzZXJ2ZWQpKjEwMCwxKSwNCiAgICBuc2UgPSByb3VuZChOU0UoUHJlZGljdGVkLE9ic2VydmVkKSwxKSwNCiAgICBzYiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsxXSwNCiAgbnUgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbMl0sDQogIGxjID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzNdDQogICkgDQojIyMxPTAuMDEzLDAuMDE4LCAwLjAyLCAwLjAyNSwgMC4wMywgMC4wMzUsIDAuMDQsIDAuMDQ1LCAwLjA1LCAwLjA1NSwgMC4wNiwgMC4wNjUsIDAuMDcsIDAuMDc1LCAwLjA4LCAoMC4wODUpLDAuMDksMC4wOTUsMC4xLCAwLjE1Lg0KDQpgYGANCg0KDQojIyNOZXcgYW5hbmx5c2lzDQojIyNJbnRlcnB1b2xhdGUgUEFSaQ0KIyMjbG9hZCBkYXRhDQpgYGB7cn0NCg0KdXBEaXIgPC0gIkQ6L1IvQ29tYmluZWREYXRhLyINCm9ic0RhdGEgPC0gIkQ6L1IvQ29tYmluZWREYXRhLyINCg0KUm9vdG1ldCA8LSByZWFkLnRhYmxlKHBhc3RlMChvYnNEYXRhLCAiUm9vdE1ldC50eHQiKSwNCiAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKSAlPiUNCiAgZHBseXI6OmZpbHRlcihFeHBOYW1lIT0iSXZlcnNlbl85MURlZm9saWF0aW9uTFNHc18xUnRfOCIpJT4lDQogIGRwbHlyOjpmaWx0ZXIoRXhwTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25MTEZERkQ1R3NfM1J0XzYiKQ0KDQpgYGANCiMjI0ludGVycG9sdWF0ZQ0KIyMjSW50ZXJwb2xhdGUgdGVtcGVyYXR1cmUgZmFjdG9yIA0KDQpgYGB7cn0NCg0KIyBDcmVhdGUgYSBUVCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbg0KDQojIEFpbTogSW50ZXJwb2xhdGVzIGxpbmVhcmx5IGJldHdlZW4gdHdvIGtub3duIHgteSBwYWlycw0KDQppbnRfZnVuYyA8LSBmdW5jdGlvbih0ZW1wLFRULHRlbXBfcmVmKXsNCg0KIyBpZiB0ZW1wIGlzIHRvbyBsb3cgb3IgdG9vIGhpZ2ggZ2l2ZSBleHRyZW1lIFRUIHZhbHVlcw0KIGlmKHRlbXBfcmVmPnRlbXBbbGVuZ3RoKHRlbXApXSkgew0KICAgDQogICBvdXQgPC0gVFRbbGVuZ3RoKFRUKV0gDQogICANCiB9IGVsc2UgaWYgKHRlbXBfcmVmPHRlbXBbMV0pIHsNCiAgIA0KICAgb3V0IDwtIFRUWzFdDQogICANCiB9IGVsc2Ugew0KICAgDQojIGVsc2UgaW50ZXJwb2xhdGUNCiAgIA0KICAgdHJ5Q2F0Y2goICANCiAgIA0KICBvdXQgPC0gYXBwcm94KHRlbXAsIFRULCB4b3V0ID0gdGVtcF9yZWYsIA0KICAgICAgICAgbWV0aG9kPSJsaW5lYXIiLCANCiAgICAgICAgIHJ1bGUgPSAyKSR5LA0KICBlcnJvciA9IGZ1bmN0aW9uKGUpIA0KICB7DQogIG91dCA8LSBOQQ0KICB9DQopIA0KICANCn0gIyBlbmQgaWYgY2hlY2sNCg0KICByZXR1cm4ob3V0KSAgDQogIA0KIH0NCiAgDQoNCiMgVGVzdCBhbmQgdGVzdCBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uIA0KDQojIFNldCBhbiBpbnB1dCBjYXJkaW5hbCB0ZW1wZXJhdHVyZSBkZg0KdHRfY2FyZCA8LSBkYXRhLmZyYW1lKHhfcmVmPWMoMS4wLCAgNS4wLCAgMTAsICAxNSwgIDMwLCAgNDApLA0KICAgICAgICAgICAgICAgICAgICAgIHlfcmVmPWMoMC4wLCAgMy4wLCAgNi41LCAxMCwgIDI1LCAgMC4wKSkNCg0KdGVtcF9yZWYgIDwtIDI1ICMgcmFuZG9tIGlucHV0IHgtYXhlcyB2YWx1ZSB0byB0ZXN0DQp0ZW1wIDwtIHR0X2NhcmQkeF9yZWYgIyB4LWF4ZXMNClRUIDwtIHR0X2NhcmQkeV9yZWYgIyB5LWF4ZXMNCg0KaW50X2Z1bmModGVtcCxUVCx0ZW1wX3JlZikgIyByZXN1bHQgbXVzdCBiZSAyMA0KYGBgDQojIyMgaW50ZXJwb2x1YXRlIGFzIHggYW5kIHkgcGFpcnMNCg0KYGBge3J9DQoNCnRfZmFjdG9yIDwtIGRhdGEuZnJhbWUoeF9yZWY9YygwLjAsIDE4LCAgMzAsICA0MCksDQogICAgICAgICAgICAgICAgICAgICAgICB5X3JlZj1jKDAuMCwgMS4wLCAgMS4wLCAgMC4wKSkNCiAgDQogIA0KVGVtLmZhY3RvcjwtUm9vdG1ldCAlPiUNCiAgbXV0YXRlKFQuZmFjdG9yPWludF9mdW5jKHRfZmFjdG9yJHhfcmVmLHRfZmFjdG9yJHlfcmVmLCBtZWFuKSklPiUNCiAgI211dGF0ZShwb3RlbnRpYWxQcm9kdWN0aW9uPVBBUmkqMTYuMipULmZhY3RvciklPiUgICAgICMjI1JVRSA9MS42Mg0KICBtdXRhdGUoQ2xvY2suVG9kYXk9ZG15KENsb2NrLlRvZGF5KSklPiUNCiAgbXV0YXRlKEV4cFVuaXRDb2RlPWFzLmZhY3RvcihFeHBOYW1lKSkNCiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANClRlbS5mYWN0b3IgIA0Kd3JpdGUuY3N2KFRlbS5mYWN0b3IgLCJEOi9SL1Jlc3BpcmF0aW9uL1RlbS5mYWN0b3IuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpDQoNCmBgYA0KDQoNCg0KIyMjZlBBUiBpbnRlcnBvbGF0ZSBmb3IgZWFjaCByb3RhdGlvbg0KIyMjI1JVRSB0ZXN0aW5nDQpgYGB7cn0NCg0KVW5pRXhwIDwtIHVuaXF1ZShUZW0uZmFjdG9yJEV4cE5hbWUpDQoNCmZQQVIuZGYgPC0gZGF0YS5mcmFtZSgpDQogIA0KZm9yKGkgaW4gMTpsZW5ndGgoVW5pRXhwKSkNCnsNCiAgDQogUm9vdG1ldGZQQVI8LVRlbS5mYWN0b3IgJT4lDQogICBmaWx0ZXIoRXhwTmFtZT09VW5pRXhwW2ldKSU+JQ0KICBtdXRhdGUoVHRfYnJva2VuX3N1bT1hcy5udW1lcmljKFR0X2Jyb2tlbl9zdW0pKQ0KICANCiBmUEFSLmRhdGE8LVJvb3RtZXRmUEFSJT4lDQogIG11dGF0ZShmUEFSPWFwcHJveChUdF9icm9rZW5fc3VtLCBGcmFuY3Rpb24sIHhvdXQgPVR0X2Jyb2tlbl9zdW0sIA0KICAgICAgICAgbWV0aG9kPSJsaW5lYXIiLCANCiAgICAgICAgIHJ1bGUgPSAyKSR5KSU+JSAgICAgIyNpbnRlcnBvbGF0ZSBmdW5jdGlvbiANCiBtdXRhdGUoUEFSaT1yYWRuKmZQQVIpJT4lIA0KICAgIHVuaXF1ZSgpJT4lDQogICAgICMjYWNjbXVsYXRlZCBmdW5jdGlvbg0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTAgPSBQQVJpKjcuMipULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMC43MmcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0wID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5MCkpJT4lDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5MSA9IFBBUmkqNy43KlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICMjI1JVRSBpcyAwLjc3Zy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bTEgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXkxKSklPiUNCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXkyID0gUEFSaSo4LjIqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDAuODJnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtMiA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTIpKSU+JQ0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTMgPSBQQVJpKjguNypULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMC44N2cvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0zID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5MykpJT4lDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5M0EgPSBQQVJpKjguOCpULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMC44OGcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0zQSA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTNBKSklPiUgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5M0IgPSBQQVJpKjguOSpULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMC44OWcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0zQiA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTNCKSklPiUgIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTNDID0gUEFSaSo5LjAqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDAuOTBnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtM0MgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXkzQykpJT4lICAgIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTNEID0gUEFSaSo5LjEqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDAuOTFnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtM0QgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXkzRCkpJT4lIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTQgPSBQQVJpKjkuMipULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMC45MmcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW00ID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5NCkpJT4lDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5NEEgPSBQQVJpKjkuMypULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMC45M2cvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW00QSA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTRBKSklPiUgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5NEIgPSBQQVJpKjkuNCpULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMC45NGcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW00QiA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTRCKSklPiUgIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTRDID0gUEFSaSo5LjUqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDAuOTVnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtNEMgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk0QykpJT4lICANCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXk0RCA9IFBBUmkqOS42KlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICMjI1JVRSBpcyAwLjk2Zy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bTREID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5NEQpKSU+JSAgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5NSA9IFBBUmkqOS43KlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICMjI1JVRSBpcyAwLjk3Zy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bTUgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk1KSklPiUNCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXk2ID0gUEFSaSoxMC4yKlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICMjI1JVRSBpcyAxLjAyZy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bTYgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk2KSklPiUgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5NyA9IFBBUmkqMTAuNypULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4wN2cvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW03ID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5NykpJT4lICANCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXk3QSA9IFBBUmkqMTAuOCpULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4wOGcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW03QSA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTdBKSklPiUgIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTdCID0gUEFSaSoxMC45KlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICMjI1JVRSBpcyAxLjA5Zy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bTdCID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5N0IpKSU+JSANCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXk3QyA9IFBBUmkqMTEuMCpULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4xMGcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW03QyA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTdDKSklPiUgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5N0QgPSBQQVJpKjExLjEqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDEuMTFnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtN0QgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk3RCkpJT4lIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTggPSBQQVJpKjExLjIqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgICMjI1JVRSBpcyAxLjEyZy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bTggPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk4KSklPiUNCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXk4QSA9IFBBUmkqMTEuMypULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4xM2cvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW04QSA9IGN1bXN1bShQcm9kdWN0aW9uLmRheThBKSklPiUgIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheThCID0gUEFSaSoxMS40KlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICMjI1JVRSBpcyAxLjE0Zy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bThCID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5OEIpKSU+JSANCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXk4QyA9IFBBUmkqMTEuNSpULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4xNWcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW04QyA9IGN1bXN1bShQcm9kdWN0aW9uLmRheThDKSklPiUgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5OEQgPSBQQVJpKjExLjYqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDEuMTZnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtOEQgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk4RCkpJT4lIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTkgID0gUEFSaSoxMS43KlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4xN2cvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW05ICA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTkpKSU+JSAgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5OUEgPSBQQVJpKjExLjgqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDEuMThnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtOUEgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk5QSkpJT4lICANCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXk5QiA9IFBBUmkqMTEuOSpULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4xOWcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW05QiA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTlCKSklPiUgDQogbXV0YXRlKFByb2R1Y3Rpb24uZGF5OUMgPSBQQVJpKjEyLjAqVC5mYWN0b3IpJT4lICAgICAgICAgICAgICAgIyMjUlVFIGlzIDEuMjBnL01KDQogbXV0YXRlKFByb2R1Y3Rpb24uc3VtOUMgPSBjdW1zdW0oUHJvZHVjdGlvbi5kYXk5QykpJT4lIA0KIG11dGF0ZShQcm9kdWN0aW9uLmRheTlEID0gUEFSaSoxMi4xKlQuZmFjdG9yKSU+JSAgICAgICAgICAgICAgICMjI1JVRSBpcyAxLjIxZy9NSg0KIG11dGF0ZShQcm9kdWN0aW9uLnN1bTlEID0gY3Vtc3VtKFByb2R1Y3Rpb24uZGF5OUQpKSU+JSANCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXkxMCA9IFBBUmkqMTIuMipULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4yMmcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0xMCA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTEwKSklPiUNCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXkxMSA9IFBBUmkqMTIuNypULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4yN2cvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0xMSA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTExKSklPiUNCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXkxMiA9IFBBUmkqMTMuMipULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4zMmcvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0xMiA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTEyKSklPiUNCiBtdXRhdGUoUHJvZHVjdGlvbi5kYXkxMyA9IFBBUmkqMTMuNypULmZhY3RvciklPiUgICAgICAgICAgICAgICAjIyNSVUUgaXMgMS4zN2cvTUoNCiBtdXRhdGUoUHJvZHVjdGlvbi5zdW0xMyA9IGN1bXN1bShQcm9kdWN0aW9uLmRheTEzKSklPiUNCiBtdXRhdGUoUG90ZW50aWFscm9vdDEgPSBQQVJpKjEqVC5mYWN0b3IpJT4lDQogbXV0YXRlKFN1bXBvdGVudGlhbDEgPSBjdW1zdW0oUG90ZW50aWFscm9vdDEpKSU+JSAgICAgICAgICAgIyMjUnVFIHJvb3QgaXMgMC4xZy9NSg0KIG11dGF0ZShQb3RlbnRpYWxyb290MiA9IFBBUmkqMipULmZhY3RvciklPiUNCiBtdXRhdGUoU3VtcG90ZW50aWFsMiA9IGN1bXN1bShQb3RlbnRpYWxyb290MikpJT4lICAgICAgICAgICAjIyMjUlVFIHJvb3QgaXMgMC4yZy9NSg0KIG11dGF0ZShQb3RlbnRpYWxyb290MyA9IFBBUmkqMi40KlQuZmFjdG9yKSU+JQ0KIG11dGF0ZShTdW1wb3RlbnRpYWwzID0gY3Vtc3VtKFBvdGVudGlhbHJvb3QzKSklPiUgICAgICAgICAgICMjIyNSVUUgcm9vdCBpcyAwLjI1Zy9NSg0KIG11dGF0ZShQb3RlbnRpYWxyb290M0EgPSBQQVJpKjIuNSpULmZhY3RvciklPiUNCiBtdXRhdGUoU3VtcG90ZW50aWFsM0EgPSBjdW1zdW0oUG90ZW50aWFscm9vdDNBKSklPiUgDQogbXV0YXRlKFBvdGVudGlhbHJvb3Q0ID0gUEFSaSozKlQuZmFjdG9yKSU+JQ0KIG11dGF0ZShTdW1wb3RlbnRpYWw0ID0gY3Vtc3VtKFBvdGVudGlhbHJvb3Q0KSklPiUgICAgICAgICAgICMjIyNSVUUgcm9vdCBpcyAwLjNnL01KDQogbXV0YXRlKFBvdGVudGlhbHJvb3Q1ID0gUEFSaSozLjUqVC5mYWN0b3IpJT4lDQogbXV0YXRlKFN1bXBvdGVudGlhbDUgPSBjdW1zdW0oUG90ZW50aWFscm9vdDUpKSU+JSAgICAgICAgICAgIyMjI1JVRSByb290IGlzIDAuMzVnL01KDQogbXV0YXRlKFBvdGVudGlhbHJvb3Q2ID0gUEFSaSo0KlQuZmFjdG9yKSU+JQ0KIG11dGF0ZShTdW1wb3RlbnRpYWw2ID0gY3Vtc3VtKFBvdGVudGlhbHJvb3Q2KSklPiUgICAgICAgICAgICMjIyNSVUUgcm9vdCBpcyAwLjRnL01KDQogbXV0YXRlKEFjY1BBUmk9Y3Vtc3VtKFBBUmkpKQ0KDQogZlBBUi5kZjwtIHJiaW5kKCBmUEFSLmRmLCBmUEFSLmRhdGEpDQoNCn0NCg0Kc3VtbWFyeShmUEFSLmRmKQ0KZlBBUi5kZg0Kd3JpdGUuY3N2KGZQQVIuZGYsIkQ6L1IvZlBBUm9vdDEuZGYuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpDQpgYGANCg0KIyMjY2FsY3VsYXRlZCBwcm90ZW50aWFsIHlpZWxkIGFuZCByZW1vYmxpc2F0aW9uDQojIyNtZXJnZSBQQVJpIGFuZCBvYnNlcnZlZCBkYXRhDQpgYGB7cn0NCkUzSUxMUzE8LUUzSUxMJT4lDQogIGZpbHRlcihUYmI9PTEpJT4lDQogIGZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoQ2xvY2suVG9kYXksRXhwTmFtZSxJbnRlcnZhbCwgVmFyaWFibGVVbml0cyxPYnNlcnZlZCxTdGRERVYsRXhwZXJpbWVudElELFRyZWF0bWVudElELElELEdyb3d0aFNlYXNvbjEsDQpSb3RhdGlvbjEsIENsb2NrLlRvZGF5MSxHcm93dGhTZWFzb24yLEdyb3d0aFJvdGF0aW9uKSU+JQ0KICBtdXRhdGUoc2hvb3RiaW9tYXNzPU9ic2VydmVkLFN0ZERFVlM9U3RkREVWKQ0KICANCg0KRTNJTExSMTwtRTNJTEwlPiUNCiAgZmlsdGVyKFRiYj09MSklPiUNCiAgZmlsdGVyKFZhcmlhYmxlPT0iUm9vdFd0IiklPiUNCiAgZHBseXI6OnNlbGVjdChDbG9jay5Ub2RheSxFeHBOYW1lLE9ic2VydmVkLFN0ZERFViklPiUNCiAgbXV0YXRlKFJvb3RXdD1PYnNlcnZlZCxTdGRERVZSPVN0ZERFVikNCg0KRTNJTEwxPC1tZXJnZShFM0lMTFMxLEUzSUxMUjEsYnk9YygiQ2xvY2suVG9kYXkiLCJFeHBOYW1lIikpJT4lDQogIGRwbHlyOjpzZWxlY3QoLU9ic2VydmVkLngsLVN0ZERFVi54LC1PYnNlcnZlZC55LCAtU3RkREVWLnkpDQogIA0KDQoNClAuRTNJTEw8LW1lcmdlKFRlbS5mYWN0b3IsRTNJTExTMSxieT1jKCJDbG9jay5Ub2RheSIsIkV4cE5hbWUiKSklPiUNCiAgdW5pcXVlKCkNCndyaXRlLmNzdihQLkUzSUxMLCJEOi9SL1Jlc3BpcmF0aW9uL1AuRTNJTEwuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpDQoNCmBgYA0KIyMjcGxvdCBwb3RlbnRhaWwgYW5kIHNob290IGJpb21hc3MNCmBgYHtyfQ0KZlBBUi5kZiU+JQ0KICBkcGx5cjo6ZmlsdGVyKElEPT0iRTNJTEwiKSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9cHJvZHVjdGlvbi5zdW0yKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiBnZW9tX3BvaW50KGRhdGE9RTNJTExTMSxhZXMoeD1DbG9jay5Ub2RheSx5PXNob290YmlvbWFzcyxjb2xvcj0icmVkIixzaXplPTIpKSsNCiAjI2ZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFNUlMTEY1IikpKw0KIHhsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKStteXRoZW1lMysgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KDQojZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9FNUlMTEY1LnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KDQpgYGANCmBgYHtyfQ0KRTNJTFNTMTwtRTNJTFMlPiUNCiAgI2ZpbHRlcihUYmI9PTEpJT4lDQogIGZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoQ2xvY2suVG9kYXksIEV4cFVuaXRDb2RlLFZhcmlhYmxlVW5pdHMsT2JzZXJ2ZWQsVmFyaWFibGUsU3RkREVWLEV4cGVyaW1lbnRJRCxJRCxHcm93dGhTZWFzb24xLA0KUm90YXRpb24xLCBDbG9jay5Ub2RheTEsR3Jvd3RoU2Vhc29uMiklPiUNCiAgbXV0YXRlKHNob290YmlvbWFzcz1PYnNlcnZlZCxTdGRERVZTPVN0ZERFVikNCg0KDQpQLkUzSUxTPC1tZXJnZShmUEFSLmRmLEUzSUxTUzEsYnk9YygiQ2xvY2suVG9kYXkiLCJFeHBVbml0Q29kZSIpKQ0KDQpmUEFSLmRmJT4lDQogIGRwbHlyOjpmaWx0ZXIoSUQ9PSJFM0lMUyIpJT4lDQpnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXkseT1wcm9kdWN0aW9uLnN1bTIpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGRhdGE9RTNJTFNTMSxhZXMoeD1DbG9jay5Ub2RheSx5PXNob290YmlvbWFzcyxjb2xvcj0icmVkIixzaXplPTIpKSsNCiAgI2ZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFNUlMTEY1IikpKw0KIHhsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKStteXRoZW1lMysgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KDQoNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KI2dnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vRTVJTExGNS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCg0KYGBgDQpgYGB7cn0NCkUzSVNMUzE8LUUzSVNMJT4lDQogICNmaWx0ZXIoVGJiPT0xKSU+JQ0KICBmaWx0ZXIoVmFyaWFibGU9PSJzaG9vdGJpb21hc3MiKSU+JQ0KICBkcGx5cjo6c2VsZWN0KENsb2NrLlRvZGF5LCBFeHBVbml0Q29kZSxWYXJpYWJsZVVuaXRzLE9ic2VydmVkLFZhcmlhYmxlLFN0ZERFVixFeHBlcmltZW50SUQsSUQsR3Jvd3RoU2Vhc29uMSwNClJvdGF0aW9uMSwgQ2xvY2suVG9kYXkxLEdyb3d0aFNlYXNvbjIpJT4lDQogIG11dGF0ZShzaG9vdGJpb21hc3M9T2JzZXJ2ZWQsU3RkREVWUz1TdGRERVYpDQoNCg0KUC5FM0lTTDwtbWVyZ2UoZlBBUi5kZixFM0lTTFMxLGJ5PWMoIkNsb2NrLlRvZGF5IiwiRXhwVW5pdENvZGUiKSkNCg0KZlBBUi5kZiU+JQ0KICBkcGx5cjo6ZmlsdGVyKElEPT0iRTNJU0wiKSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9cHJvZHVjdGlvbi5zdW0yKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChkYXRhPUUzSVNMUzEsYWVzKHg9Q2xvY2suVG9kYXkseT1zaG9vdGJpb21hc3MsY29sb3I9InJlZCIsc2l6ZT0yKSkrDQogICNmYWNldF9ncmlkKFZhcmlhYmxlfklEKStnZ3RpdGxlKHBhc3RlMCgiRTVJTExGNSIpKSsNCiB4bGFiKCJEYXRlIikreWxhYigiQmlvbWFzcyAoa2cvaGEpIikrbXl0aGVtZTMrIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikNCg0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQojZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9FNUlMTEY1LnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KDQpgYGANCmBgYHtyfQ0KRTNJU1NTMTwtRTNJU1MlPiUNCiAgI2ZpbHRlcihUYmI9PTEpJT4lDQogIGZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoQ2xvY2suVG9kYXksIEV4cFVuaXRDb2RlLFZhcmlhYmxlVW5pdHMsT2JzZXJ2ZWQsVmFyaWFibGUsU3RkREVWLEV4cGVyaW1lbnRJRCxJRCxHcm93dGhTZWFzb24xLA0KUm90YXRpb24xLCBDbG9jay5Ub2RheTEsR3Jvd3RoU2Vhc29uMiklPiUNCiAgbXV0YXRlKHNob290YmlvbWFzcz1PYnNlcnZlZCxTdGRERVZTPVN0ZERFVikNCg0KDQpQLkUzSVNTPC1tZXJnZShmUEFSLmRmLEUzSVNTUzEsYnk9YygiQ2xvY2suVG9kYXkiLCJFeHBVbml0Q29kZSIpKQ0KDQpmUEFSLmRmJT4lDQogIGRwbHlyOjpmaWx0ZXIoSUQ9PSJFM0lTUyIpJT4lDQpnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXkseT1wcm9kdWN0aW9uLnN1bTIpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBnZW9tX3BvaW50KGRhdGE9RTNJU1NTMSxhZXMoeD1DbG9jay5Ub2RheSx5PXNob290YmlvbWFzcyxjb2xvcj0icmVkIixzaXplPTIpKSsNCiAgI2ZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFNUlMTEY1IikpKw0KIHhsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKStteXRoZW1lMysgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KDQp3cml0ZS5jc3YoUC5FM0lTUywiRDovUi9SZXNwaXJhdGlvbi9QLkUzSVNTLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KICAjcmVtb3ZlIGdyaWQgbGluZXMgDQojZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkLy9FNUlMTEY1LnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KDQpgYGANCmBgYHtyfQ0KRTVJSEhGNVMxPC1FNUlISEZENSU+JQ0KICAjZmlsdGVyKFRiYj09MSklPiUNCiAgZmlsdGVyKFZhcmlhYmxlPT0ic2hvb3RiaW9tYXNzIiklPiUNCiAgZHBseXI6OnNlbGVjdChDbG9jay5Ub2RheSwgRXhwVW5pdENvZGUsVmFyaWFibGVVbml0cyxPYnNlcnZlZCxWYXJpYWJsZSxTdGRERVYsRXhwZXJpbWVudElELElELEdyb3d0aFNlYXNvbjEsDQpSb3RhdGlvbjEsIENsb2NrLlRvZGF5MSxHcm93dGhTZWFzb24yKSU+JQ0KICBtdXRhdGUoc2hvb3RiaW9tYXNzPU9ic2VydmVkLFN0ZERFVlM9U3RkREVWKQ0KDQoNClAuRTVJSEhGNTwtbWVyZ2UoZlBBUi5kZixFNUlISEY1UzEsYnk9YygiQ2xvY2suVG9kYXkiLCJFeHBVbml0Q29kZSIpKQ0KDQpmUEFSLmRmJT4lDQogIGRwbHlyOjpmaWx0ZXIoSUQ9PSJFNUlISEY1IiklPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PXByb2R1Y3Rpb24uc3VtMikpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogIGdlb21fcG9pbnQoZGF0YT1FNUlISEY1UzEsYWVzKHg9Q2xvY2suVG9kYXkseT1zaG9vdGJpb21hc3MsY29sb3I9InJlZCIsc2l6ZT0yKSkrDQogICNmYWNldF9ncmlkKFZhcmlhYmxlfklEKStnZ3RpdGxlKHBhc3RlMCgiRTVJTExGNSIpKSsNCiB4bGFiKCJEYXRlIikreWxhYigiQmlvbWFzcyAoa2cvaGEpIikrbXl0aGVtZTMrIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KI2dnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vRTVJTExGNS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCg0KYGBgDQpgYGB7cn0NCkU1SVNTRjVTMTwtRTVJU1NGRDUlPiUNCiAgI2ZpbHRlcihUYmI9PTEpJT4lDQogIGZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoQ2xvY2suVG9kYXksIEV4cFVuaXRDb2RlLFZhcmlhYmxlVW5pdHMsT2JzZXJ2ZWQsVmFyaWFibGUsU3RkREVWLEV4cGVyaW1lbnRJRCxJRCxHcm93dGhTZWFzb24xLA0KUm90YXRpb24xLCBDbG9jay5Ub2RheTEsR3Jvd3RoU2Vhc29uMiklPiUNCiAgbXV0YXRlKHNob290YmlvbWFzcz1PYnNlcnZlZCxTdGRERVZTPVN0ZERFVikNCg0KDQpQLkU1SVNTRjVTMTwtbWVyZ2UoZlBBUi5kZixFNUlTU0Y1UzEsYnk9YygiQ2xvY2suVG9kYXkiLCJFeHBVbml0Q29kZSIpKQ0KDQpmUEFSLmRmJT4lDQogIGRwbHlyOjpmaWx0ZXIoSUQ9PSJFNUlTU0Y1IiklPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PXByb2R1Y3Rpb24uc3VtMikpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogIGdlb21fcG9pbnQoZGF0YT1FNUlTU0Y1UzEsYWVzKHg9Q2xvY2suVG9kYXkseT1zaG9vdGJpb21hc3MsY29sb3I9InJlZCIsc2l6ZT0yKSkrDQogICNmYWNldF9ncmlkKFZhcmlhYmxlfklEKStnZ3RpdGxlKHBhc3RlMCgiRTVJTExGNSIpKSsNCiB4bGFiKCJEYXRlIikreWxhYigiQmlvbWFzcyAoa2cvaGEpIikrbXl0aGVtZTMrIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikNCiAgI3JlbW92ZSBncmlkIGxpbmVzIA0KI2dnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC8vRTVJTExGNS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCg0KYGBgDQoNCmBgYHtyfQ0KDQpFNUlMTEY1UzE8LUU1SUxMRjUlPiUNCiAgI2ZpbHRlcihUYmI9PTEpJT4lDQogIGZpbHRlcihWYXJpYWJsZT09InNob290YmlvbWFzcyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoQ2xvY2suVG9kYXksIEV4cFVuaXRDb2RlLFZhcmlhYmxlVW5pdHMsT2JzZXJ2ZWQsVmFyaWFibGUsU3RkREVWLEV4cGVyaW1lbnRJRCxJRCxHcm93dGhTZWFzb24xLA0KUm90YXRpb24xLCBDbG9jay5Ub2RheTEsR3Jvd3RoU2Vhc29uMiklPiUNCiAgbXV0YXRlKHNob290YmlvbWFzcz1PYnNlcnZlZCxTdGRERVZTPVN0ZERFVikNCg0KDQpQLkU1SUxMRjVTMTwtbWVyZ2UoZlBBUi5kZixFNUlMTEY1UzEsYnk9YygiQ2xvY2suVG9kYXkiLCJFeHBVbml0Q29kZSIpKQ0KDQoNCmZQQVIuZGYlPiUNCiAgZHBseXI6OmZpbHRlcihJRD09IkU1SUxMRjUiKSU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9cHJvZHVjdGlvbi5zdW0yKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZ2VvbV9wb2ludChkYXRhPUU1SUxMRjVTMSxhZXMoeD1DbG9jay5Ub2RheSx5PXNob290YmlvbWFzcyxjb2xvcj0icmVkIixzaXplPTIpKSsNCiAgI2ZhY2V0X2dyaWQoVmFyaWFibGV+SUQpK2dndGl0bGUocGFzdGUwKCJFNUlMTEY1IikpKw0KIHhsYWIoIkRhdGUiKSt5bGFiKCJCaW9tYXNzIChrZy9oYSkiKStteXRoZW1lMysgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KYGBgDQojIyNMb2FkIGRhdGEgDQojIyNhbmFseXNpcyBvZiBwcm9kdWN0aW9uDQpgYGB7cn0NCnVwRGlyIDwtICJEOi9SL1Jlc3BpcmF0aW9uLyINCm9ic0RhdGEgPC0gIkQ6L1IvUmVzcGlyYXRpb24vIg0KQmlvbWFzcyA8LSByZWFkLmNzdihwYXN0ZTAob2JzRGF0YSwgImZQQVJvb3QuZGYuQ1NWIiksDQogICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lDQogIG11dGF0ZShDbG9jay5Ub2RheT1kbXkoQ2xvY2suVG9kYXkpKQ0KDQpCaW9tYXNzLkxMPC1CaW9tYXNzJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjUm9vdCBiaW9tYXNzIGp1c3QgZnJvbSByZXNwaXJhdGlvbiAwLjAzDQogIGZpbHRlcihJRD09IkUzSUxMIiklPiUNCiAgZmlsdGVyKFJvb3RSZXNwaXJhdGlvbjEhPSJOQSIpDQoNCkJpb21hc3MuTEwlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RSZXNwaXJhdGlvbjEpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpK215dGhlbWUzKw0KICBnZW9tX3BvaW50KGFlcyh5PVJvb3RXdCxzaXplPTIpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFJlc3BpcmF0aW9uMikpK2dndGl0bGUocGFzdGUwKCJFM0lMTCIpKSsNCiB4bGFiKCJEYXRlIikreWxhYigiUm9vdCBiaW9tYXNzIChrZy9oYSkiKSt0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpDQoNCg0KYGBgDQojIyMjI1Jvb3QgZ3Jvd3RoIFJhdGUgY2FsY3VsYXRpb24NCiMjI3Bsb3QgcG90ZW50aWFsIHJvb3QgYmlvbWFzcyBhZ2FuaXN0IGFjY3VtbGF0ZWQgVHQgKGxpbmVhciByZWdyZXNzaW9uIGFuYWx5c2lzKQ0KIyMjI2NhbGN1bGF0ZSByb290IGdyb3d0aCByYXRlDQpgYGB7cixoZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQoNCkJpb21hc3MxPC1CaW9tYXNzJT4lDQogIG11dGF0ZShQVD1UdF9maWNrX3N1bS9QcCklPiUNCiAgbXV0YXRlKHBlcj1QYXJ0aXRpb25pbmcvcHJvZHVjdGlvbi5zdW0pJT4lDQogIGZpbHRlcihFeHBlcmltZW50SUQ9PSJFMyIpJT4lDQogIGZpbHRlcihQYXJ0aXRpb25pbmchPSJOQSIpDQoNCkJpb21hc3MxJT4lDQogICNmaWx0ZXIoSUQ9PSJFM0lMTCIpJT4lDQogIGdncGxvdChhZXMoeD1UdF9icm9rZW5fc3VtLCB5PVBhcnRpdGlvbmluZyxjb2xvcj1JRCkpK2dlb21fcG9pbnQoc2l6ZT0xKSsNCiAgZmFjZXRfZ3JpZChHcm93dGhTZWFzb25+Um90YXRpb24pICsgdGhlbWVfYncoKStteXRoZW1lMyt4bGFiKCJUaGVybWFsIHRpbWUiKSt5bGFiKCJQb3RlbnRpYWwgcm9vdCBzdG9yYWdlIikNCiAgICNnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpIA0KICAjZ2VvbV9wb2ludChhZXMoeT1Sb290V3Qsc2l6ZT0yKSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RSZXNwaXJhdGlvbjIpKQ0KDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvcm9vdHN0b3JhZ2UucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQoNCmBgYA0KIyMjI0luY3JlYXNpbmcgUHANCiMjI1JVRSB0ZXN0aW5nDQoNCmBgYHtyLHdpZHRoPTgsIGhlaWdodD02fQ0KDQpCaW9tYXNzSW5jIDwtIEJpb21hc3MgJT4lIA0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTMiKSU+JQ0KICBmaWx0ZXIoc2hvb3RiaW9tYXNzIT0iTkEiKSU+JQ0KICBmaWx0ZXIoVHJlbmQ9PSJJbmMiKSU+JQ0KICBmaWx0ZXIoZlBBUiE9MCklPiUNCiAgZHBseXI6OnNlbGVjdChFeHBlcmltZW50SUQsVHJlYXRtZW50SUQsSUQsQ2xvY2suVG9kYXksVGVhcnRoLFRyZW5kLFN0YWdlLEdyb3d0aFJvdGF0aW9uLHNob290YmlvbWFzcyxTdFMsUHJvZHVjdGlvbi5zdW0wLFByb2R1Y3Rpb24uc3VtMSxQcm9kdWN0aW9uLnN1bTIsUHJvZHVjdGlvbi5zdW0zLFByb2R1Y3Rpb24uc3VtM0EsUHJvZHVjdGlvbi5zdW0zQixQcm9kdWN0aW9uLnN1bTNDLFByb2R1Y3Rpb24uc3VtM0QsUHJvZHVjdGlvbi5zdW00LFByb2R1Y3Rpb24uc3VtNEEsUHJvZHVjdGlvbi5zdW00QixQcm9kdWN0aW9uLnN1bTRDLFByb2R1Y3Rpb24uc3VtNEQsUHJvZHVjdGlvbi5zdW01LFByb2R1Y3Rpb24uc3VtNixQcm9kdWN0aW9uLnN1bTcsUHJvZHVjdGlvbi5zdW03QSxQcm9kdWN0aW9uLnN1bTdCLFByb2R1Y3Rpb24uc3VtN0MsUHJvZHVjdGlvbi5zdW03RCxQcm9kdWN0aW9uLnN1bTgsUHJvZHVjdGlvbi5zdW04QSxQcm9kdWN0aW9uLnN1bThCLFByb2R1Y3Rpb24uc3VtOEMsUHJvZHVjdGlvbi5zdW04RCxQcm9kdWN0aW9uLnN1bTksUHJvZHVjdGlvbi5zdW05QSxQcm9kdWN0aW9uLnN1bTlCLFByb2R1Y3Rpb24uc3VtOUMsUHJvZHVjdGlvbi5zdW05RCxQcm9kdWN0aW9uLnN1bTEwLFByb2R1Y3Rpb24uc3VtMTEsUHJvZHVjdGlvbi5zdW0xMixQcm9kdWN0aW9uLnN1bTEzKSAlPiUNCiAgdGlkeXI6OmdhdGhlcigiVmFyaWFibGUiLCJQcmVkaWN0ZWQiLFByb2R1Y3Rpb24uc3VtMzpQcm9kdWN0aW9uLnN1bTEwKQ0KICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCJ8R3Jvd3RoUm90YXRpb24hPSIzMSIpDQogICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZERkQ1IikNCkJpb21hc3NJbmMgJFZhcmlhYmxlPC1mYWN0b3IoQmlvbWFzc0luYyRWYXJpYWJsZSwgbGV2ZWxzPWMoIlByb2R1Y3Rpb24uc3VtMCIsIlByb2R1Y3Rpb24uc3VtMSIsIlByb2R1Y3Rpb24uc3VtMiIsIlByb2R1Y3Rpb24uc3VtMyIsIlByb2R1Y3Rpb24uc3VtM0EiLCJQcm9kdWN0aW9uLnN1bTNCIiwiUHJvZHVjdGlvbi5zdW0zQyIsIlByb2R1Y3Rpb24uc3VtM0QiLCJQcm9kdWN0aW9uLnN1bTQiLCJQcm9kdWN0aW9uLnN1bTRBIiwiUHJvZHVjdGlvbi5zdW00QiIsIlByb2R1Y3Rpb24uc3VtNEMiLCJQcm9kdWN0aW9uLnN1bTREIiwiUHJvZHVjdGlvbi5zdW01IiwiUHJvZHVjdGlvbi5zdW02IiwiUHJvZHVjdGlvbi5zdW03IiwiUHJvZHVjdGlvbi5zdW03QSIsIlByb2R1Y3Rpb24uc3VtN0IiLCJQcm9kdWN0aW9uLnN1bTdDIiwiUHJvZHVjdGlvbi5zdW03RCIsIlByb2R1Y3Rpb24uc3VtOCIsIlByb2R1Y3Rpb24uc3VtOEEiLCJQcm9kdWN0aW9uLnN1bThCIiwiUHJvZHVjdGlvbi5zdW04QyIsIlByb2R1Y3Rpb24uc3VtOEQiLCJQcm9kdWN0aW9uLnN1bTkiLCJQcm9kdWN0aW9uLnN1bTlBIiwiUHJvZHVjdGlvbi5zdW05QiIsIlByb2R1Y3Rpb24uc3VtOUMiLCJQcm9kdWN0aW9uLnN1bTlEIiwiUHJvZHVjdGlvbi5zdW0xMCIsIlByb2R1Y3Rpb24uc3VtMTEiLCJQcm9kdWN0aW9uLnN1bTEyIiwiUHJvZHVjdGlvbi5zdW0xMyIpKQ0KDQpCaW9tYXNzSW5jJT4lDQogIGdncGxvdChhZXMoeD1zaG9vdGJpb21hc3MsIHk9IFByZWRpY3RlZCwgY29sb3VyPSBmYWN0b3IoSUQpKSkgKw0KICBnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkgKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDEpKw0KICBnZ3RpdGxlKCJTaG9vdCBiaW9tYXNzIChJbmMpIikrDQogIGZhY2V0X3dyYXAoflZhcmlhYmxlLCBuY29sID0gNikrDQogIHRoZW1lX2J3KCkrbXl0aGVtZTMrDQogICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDAsODAwMCwgYnkgPTMwMDApLCBsaW1pdHM9YygwLDgwMDApKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDAwLCA2MDAwLCBieSA9MjAwMCksIGxpbWl0cz1jKDAsODAwMCkpKw0KICB5bGFiKCJQcmVkaWN0ZWQiKSt4bGFiKCJPYnNlcnZlZCIpICt0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpDQogZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1JVRXNob290SW5jLnBuZyIsIHdpZHRoPTgsIGhlaWdodD04LCBkcGk9NTAwKQ0KIA0KYGBgDQpgYGB7cix3aWR0aD04LCBoZWlnaHQ9Nn0NCkJpb21hc3NTaG9vdEUzMTwtQmlvbWFzc0luYyU+JQ0KICBmaWx0ZXIoVmFyaWFibGU9PSJQcm9kdWN0aW9uLnN1bTkiKQ0KQmlvbWFzc1Nob290RTMxJT4lDQpnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXkseT1zaG9vdGJpb21hc3MpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBmYWNldF93cmFwKH5JRCxuY29sID0gMSkrDQogIGdlb21fcG9pbnQoYWVzKHg9Q2xvY2suVG9kYXksIHk9UHJlZGljdGVkKSxjb2xvdXI9ImdyZWVuIixzaXplPTMpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKGJxdW90ZShib2xkKCdTaG9vdCBETSAoJyprZ35oYV4tMSonKScpKSkrDQogbXl0aGVtZTMNCmBgYA0KDQoNCmBgYHtyfQ0KDQpCaW9tYXNzSW5jICU+JQ0KICBtdXRhdGUoT2JzZXJ2ZWQ9c2hvb3RiaW9tYXNzKSU+JQ0KICBncm91cF9ieShWYXJpYWJsZSkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBuID0gbigpLA0KICAgIHIyID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzVdLA0KICAjICBybXNlID0gcm91bmQocm1zZShQcmVkaWN0ZWQsT2JzZXJ2ZWQpLDApLA0KICAgIHJfcm1zZSA9IHJvdW5kKHJtc2UoUHJlZGljdGVkLE9ic2VydmVkKS9tZWFuKE9ic2VydmVkKSoxMDAsMSksDQogICAgbnNlID0gcm91bmQoTlNFKFByZWRpY3RlZCxPYnNlcnZlZCksMSksDQogICAgc2IgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbMV0sDQogIG51ID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzJdLA0KICBsYyA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVszXQ0KICApIA0KIyMjMT0wLjcyLCAwLjc3LCAwLjgyLCAwLjg3LCAwLjkyLCAwLjk3LCAxLjAyLCAxLjA3LCAxLjEyLCAoMS4xNyksIDEuMjIsIDEuMjcsIDEuMzIsMS4zNywgMS40MiwgMS41MiwgMS42MiwgMS43Mg0KDQpgYGANCg0KIyMjI0RlYyBQcA0KYGBge3Isd2lkdGg9OCwgaGVpZ2h0PTh9DQpCaW9tYXNzRGVjIDwtIEJpb21hc3MgJT4lIA0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTMiKSU+JQ0KICBmaWx0ZXIoc2hvb3RiaW9tYXNzIT0iTkEiKSU+JQ0KICBmaWx0ZXIoVHJlbmQ9PSJEZWMiKSU+JQ0KICBmaWx0ZXIoZlBBUiE9MCklPiUNCiAgZHBseXI6OnNlbGVjdChFeHBlcmltZW50SUQsVHJlYXRtZW50SUQsSUQsQ2xvY2suVG9kYXksVGVhcnRoLFRyZW5kLFN0YWdlLEdyb3d0aFJvdGF0aW9uLHNob290YmlvbWFzcyxTdFMsUHJvZHVjdGlvbi5zdW0wLFByb2R1Y3Rpb24uc3VtMSxQcm9kdWN0aW9uLnN1bTIsUHJvZHVjdGlvbi5zdW0zLFByb2R1Y3Rpb24uc3VtM0EsUHJvZHVjdGlvbi5zdW0zQixQcm9kdWN0aW9uLnN1bTNDLFByb2R1Y3Rpb24uc3VtM0QsUHJvZHVjdGlvbi5zdW00LFByb2R1Y3Rpb24uc3VtNEEsUHJvZHVjdGlvbi5zdW00QixQcm9kdWN0aW9uLnN1bTRDLFByb2R1Y3Rpb24uc3VtNEQsUHJvZHVjdGlvbi5zdW01LFByb2R1Y3Rpb24uc3VtNixQcm9kdWN0aW9uLnN1bTcsUHJvZHVjdGlvbi5zdW03QSxQcm9kdWN0aW9uLnN1bTdCLFByb2R1Y3Rpb24uc3VtN0MsUHJvZHVjdGlvbi5zdW03RCxQcm9kdWN0aW9uLnN1bTgsUHJvZHVjdGlvbi5zdW04QSxQcm9kdWN0aW9uLnN1bThCLFByb2R1Y3Rpb24uc3VtOEMsUHJvZHVjdGlvbi5zdW04RCxQcm9kdWN0aW9uLnN1bTksUHJvZHVjdGlvbi5zdW05QSxQcm9kdWN0aW9uLnN1bTlCLFByb2R1Y3Rpb24uc3VtOUMsUHJvZHVjdGlvbi5zdW05RCxQcm9kdWN0aW9uLnN1bTEwLFByb2R1Y3Rpb24uc3VtMTEsUHJvZHVjdGlvbi5zdW0xMixQcm9kdWN0aW9uLnN1bTEzKSAlPiUNCiAgdGlkeXI6OmdhdGhlcigiVmFyaWFibGUiLCJQcmVkaWN0ZWQiLFByb2R1Y3Rpb24uc3VtMzpQcm9kdWN0aW9uLnN1bTEwKQ0KICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCJ8R3Jvd3RoUm90YXRpb24hPSIzMSIpDQogICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZERkQ1IikNCkJpb21hc3NEZWMgJFZhcmlhYmxlPC1mYWN0b3IoQmlvbWFzc0RlYyRWYXJpYWJsZSwgbGV2ZWxzPWMoIlByb2R1Y3Rpb24uc3VtMCIsIlByb2R1Y3Rpb24uc3VtMSIsIlByb2R1Y3Rpb24uc3VtMiIsIlByb2R1Y3Rpb24uc3VtMyIsIlByb2R1Y3Rpb24uc3VtM0EiLCJQcm9kdWN0aW9uLnN1bTNCIiwiUHJvZHVjdGlvbi5zdW0zQyIsIlByb2R1Y3Rpb24uc3VtM0QiLCJQcm9kdWN0aW9uLnN1bTQiLCJQcm9kdWN0aW9uLnN1bTRBIiwiUHJvZHVjdGlvbi5zdW00QiIsIlByb2R1Y3Rpb24uc3VtNEMiLCJQcm9kdWN0aW9uLnN1bTREIiwiUHJvZHVjdGlvbi5zdW01IiwiUHJvZHVjdGlvbi5zdW02IiwiUHJvZHVjdGlvbi5zdW03IiwiUHJvZHVjdGlvbi5zdW03QSIsIlByb2R1Y3Rpb24uc3VtN0IiLCJQcm9kdWN0aW9uLnN1bTdDIiwiUHJvZHVjdGlvbi5zdW03RCIsIlByb2R1Y3Rpb24uc3VtOCIsIlByb2R1Y3Rpb24uc3VtOEEiLCJQcm9kdWN0aW9uLnN1bThCIiwiUHJvZHVjdGlvbi5zdW04QyIsIlByb2R1Y3Rpb24uc3VtOEQiLCJQcm9kdWN0aW9uLnN1bTkiLCJQcm9kdWN0aW9uLnN1bTlBIiwiUHJvZHVjdGlvbi5zdW05QiIsIlByb2R1Y3Rpb24uc3VtOUMiLCJQcm9kdWN0aW9uLnN1bTlEIiwiUHJvZHVjdGlvbi5zdW0xMCIsIlByb2R1Y3Rpb24uc3VtMTEiLCJQcm9kdWN0aW9uLnN1bTEyIiwiUHJvZHVjdGlvbi5zdW0xMyIpKQ0KDQpCaW9tYXNzRGVjJT4lDQogIGdncGxvdChhZXMoeD1zaG9vdGJpb21hc3MsIHk9IFByZWRpY3RlZCwgY29sb3VyPSBmYWN0b3IoSUQpKSkgKw0KICBnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkgKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDEpKw0KICBnZ3RpdGxlKCJTaG9vdCBiaW9tYXNzIChEZWMpIikrDQogIGZhY2V0X3dyYXAoflZhcmlhYmxlLCBuY29sID0gNikrDQogIHRoZW1lX2J3KCkrbXl0aGVtZTMrDQogICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDAsODAwMCwgYnkgPTMwMDApLCBsaW1pdHM9YygwLDgwMDApKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDAwLCA2MDAwLCBieSA9MjAwMCksIGxpbWl0cz1jKDAsODAwMCkpKw0KICB5bGFiKCJQcmVkaWN0ZWQiKSt4bGFiKCJPYnNlcnZlZCIpICt0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpDQogZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1JVRXNob290RGVjLnBuZyIsIHdpZHRoPTgsIGhlaWdodD04LCBkcGk9NTAwKQ0KYGBgDQpgYGB7cix3aWR0aD04LCBoZWlnaHQ9Nn0NCiAgDQpCaW9tYXNzU2hvb3RFMzI8LUJpb21hc3NEZWMlPiUNCiAgZmlsdGVyKFZhcmlhYmxlPT0iUHJvZHVjdGlvbi5zdW00QSIpDQpCaW9tYXNzU2hvb3RFMzIlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PXNob290YmlvbWFzcykpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogIGZhY2V0X3dyYXAofklELG5jb2wgPSAxKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSwgeT1QcmVkaWN0ZWQpLGNvbG91cj0iZ3JlZW4iLHNpemU9MykrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoYnF1b3RlKGJvbGQoJ1Nob290IERNICgnKmtnfmhhXi0xKicpJykpKSsNCiBteXRoZW1lMw0KYGBgDQoNCiMjI0NvbWJpbmUgaW5jcmVhc2luZiBhbmQgZGVjcmVhc2luZyBzaG9vdCBiaW9tYXNzDQpgYGB7cix3aWR0aD04LCBoZWlnaHQ9Nn0NCkJpb21hc3NTaG9vdEUzPC1yYmluZChCaW9tYXNzU2hvb3RFMzEsQmlvbWFzc1Nob290RTMyKQ0KDQpCaW9tYXNzU2hvb3RFMyU+JQ0KZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LHk9c2hvb3RiaW9tYXNzKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKSsNCiAgZmFjZXRfd3JhcCh+SUQsbmNvbCA9IDEpKw0KICBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVByZWRpY3RlZCksY29sb3VyPSJncmVlbiIsc2l6ZT0zKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSt4bGFiKCJEYXRlIikreWxhYihicXVvdGUoYm9sZCgnU2hvb3QgRE0gKCcqa2d+aGFeLTEqJyknKSkpKw0KIG15dGhlbWUzDQoNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9TaG9vdGJpb21hc3MucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTgsIGRwaT01MDApDQoNCmBgYA0KDQojIyNzdGlzdGljYWwgbWVhc3VyZW1lbnQNCmBgYHtyfQ0KDQpCaW9tYXNzRGVjICU+JQ0KICBtdXRhdGUoT2JzZXJ2ZWQ9c2hvb3RiaW9tYXNzKSU+JQ0KICBncm91cF9ieShWYXJpYWJsZSkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBuID0gbigpLA0KICAgIHIyID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzVdLA0KICAjICBybXNlID0gcm91bmQocm1zZShQcmVkaWN0ZWQsT2JzZXJ2ZWQpLDApLA0KICAgIHJfcm1zZSA9IHJvdW5kKHJtc2UoUHJlZGljdGVkLE9ic2VydmVkKS9tZWFuKE9ic2VydmVkKSoxMDAsMSksDQogICAgbnNlID0gcm91bmQoTlNFKFByZWRpY3RlZCxPYnNlcnZlZCksMSksDQogICAgc2IgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbMV0sDQogIG51ID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzJdLA0KICBsYyA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVszXQ0KICApIA0KIyMjMT0wLjcyLCAwLjc3LCAwLjgyLCAwLjg3LCAwLjkyLCgwLjkzKSwgMC45NywgMS4wMiwgMS4wNywgMS4xMiwgMS4xNywgMS4yMiwgMS4yNywgMS4zMiwxLjM3LCAxLjQyLCAxLjUyLCAxLjYyLCAxLjcyDQoNCmBgYA0KDQoNCg0KIyMjUlVFIHRlc3RpbmcgZm9yIHNlZWRsaW5nIGNyb3ANCg0KYGBge3Isd2lkdGg9NiwgaGVpZ2h0PTh9DQoNCkJpb21hc3NJbmMxIDwtIEJpb21hc3MgJT4lIA0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTUiKSU+JQ0KICBmaWx0ZXIoc2hvb3RiaW9tYXNzIT0iTkEiKSU+JQ0KICBmaWx0ZXIoVHJlbmQ9PSJJbmMiKSU+JQ0KICBmaWx0ZXIoZlBBUiE9MCklPiUNCiAgZmlsdGVyKFN0YWdlIT0iU2VlZGxpbmciKSU+JQ0KICBkcGx5cjo6c2VsZWN0KEV4cGVyaW1lbnRJRCxUcmVhdG1lbnRJRCxJRCxDbG9jay5Ub2RheSxUZWFydGgsVHJlbmQsU3RhZ2UsR3Jvd3RoUm90YXRpb24sc2hvb3RiaW9tYXNzLFN0UyxQcm9kdWN0aW9uLnN1bTAsUHJvZHVjdGlvbi5zdW0xLFByb2R1Y3Rpb24uc3VtMixQcm9kdWN0aW9uLnN1bTMsUHJvZHVjdGlvbi5zdW0zQSxQcm9kdWN0aW9uLnN1bTNCLFByb2R1Y3Rpb24uc3VtM0MsUHJvZHVjdGlvbi5zdW0zRCxQcm9kdWN0aW9uLnN1bTQsUHJvZHVjdGlvbi5zdW00QSxQcm9kdWN0aW9uLnN1bTRCLFByb2R1Y3Rpb24uc3VtNEMsUHJvZHVjdGlvbi5zdW00RCxQcm9kdWN0aW9uLnN1bTUsUHJvZHVjdGlvbi5zdW02LFByb2R1Y3Rpb24uc3VtNyxQcm9kdWN0aW9uLnN1bTdBLFByb2R1Y3Rpb24uc3VtN0IsUHJvZHVjdGlvbi5zdW03QyxQcm9kdWN0aW9uLnN1bTdELFByb2R1Y3Rpb24uc3VtOCxQcm9kdWN0aW9uLnN1bThBLFByb2R1Y3Rpb24uc3VtOEIsUHJvZHVjdGlvbi5zdW04QyxQcm9kdWN0aW9uLnN1bThELFByb2R1Y3Rpb24uc3VtOSxQcm9kdWN0aW9uLnN1bTlBLFByb2R1Y3Rpb24uc3VtOUIsUHJvZHVjdGlvbi5zdW05QyxQcm9kdWN0aW9uLnN1bTlELFByb2R1Y3Rpb24uc3VtMTAsUHJvZHVjdGlvbi5zdW0xMSxQcm9kdWN0aW9uLnN1bTEyLFByb2R1Y3Rpb24uc3VtMTMpICU+JQ0KICB0aWR5cjo6Z2F0aGVyKCJWYXJpYWJsZSIsIlByZWRpY3RlZCIsUHJvZHVjdGlvbi5zdW0zOlByb2R1Y3Rpb24uc3VtMTApDQogICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fOTFEZWZvbGlhdGlvbkxMInxHcm93dGhSb3RhdGlvbiE9IjMxIikNCiAgI2ZpbHRlcihOYW1lIT0iSXZlcnNlbl8xMjFEZWZvbGlhdGlvbkhIRkRGRDUiKQ0KQmlvbWFzc0luYzEgJFZhcmlhYmxlPC1mYWN0b3IoQmlvbWFzc0luYzEkVmFyaWFibGUsIGxldmVscz1jKCJQcm9kdWN0aW9uLnN1bTAiLCJQcm9kdWN0aW9uLnN1bTEiLCJQcm9kdWN0aW9uLnN1bTIiLCJQcm9kdWN0aW9uLnN1bTMiLCJQcm9kdWN0aW9uLnN1bTNBIiwiUHJvZHVjdGlvbi5zdW0zQiIsIlByb2R1Y3Rpb24uc3VtM0MiLCJQcm9kdWN0aW9uLnN1bTNEIiwiUHJvZHVjdGlvbi5zdW00IiwiUHJvZHVjdGlvbi5zdW00QSIsIlByb2R1Y3Rpb24uc3VtNEIiLCJQcm9kdWN0aW9uLnN1bTRDIiwiUHJvZHVjdGlvbi5zdW00RCIsIlByb2R1Y3Rpb24uc3VtNSIsIlByb2R1Y3Rpb24uc3VtNiIsIlByb2R1Y3Rpb24uc3VtNyIsIlByb2R1Y3Rpb24uc3VtN0EiLCJQcm9kdWN0aW9uLnN1bTdCIiwiUHJvZHVjdGlvbi5zdW03QyIsIlByb2R1Y3Rpb24uc3VtN0QiLCJQcm9kdWN0aW9uLnN1bTgiLCJQcm9kdWN0aW9uLnN1bThBIiwiUHJvZHVjdGlvbi5zdW04QiIsIlByb2R1Y3Rpb24uc3VtOEMiLCJQcm9kdWN0aW9uLnN1bThEIiwiUHJvZHVjdGlvbi5zdW05IiwiUHJvZHVjdGlvbi5zdW05QSIsIlByb2R1Y3Rpb24uc3VtOUIiLCJQcm9kdWN0aW9uLnN1bTlDIiwiUHJvZHVjdGlvbi5zdW05RCIsIlByb2R1Y3Rpb24uc3VtMTAiLCJQcm9kdWN0aW9uLnN1bTExIiwiUHJvZHVjdGlvbi5zdW0xMiIsIlByb2R1Y3Rpb24uc3VtMTMiKSkNCkJpb21hc3NJbmMxJT4lDQogIGdncGxvdChhZXMoeD1zaG9vdGJpb21hc3MsIHk9IFByZWRpY3RlZCwgY29sb3VyPSBmYWN0b3IoSUQpKSkgKw0KICBnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkgKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDEpKw0KICBnZ3RpdGxlKCJTaG9vdCBiaW9tYXNzIChJbmMpIikrDQogIGZhY2V0X3dyYXAoflZhcmlhYmxlLCBuY29sID0gNikrDQogIHRoZW1lX2J3KCkrbXl0aGVtZTMrDQogICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDAsODAwMCwgYnkgPTMwMDApLCBsaW1pdHM9YygwLDgwMDApKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDAwLCA2MDAwLCBieSA9MjAwMCksIGxpbWl0cz1jKDAsODAwMCkpKw0KICB5bGFiKCJQcmVkaWN0ZWQiKSt4bGFiKCJPYnNlcnZlZCIpICsNCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KIGdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9SVUVzaG9vdEluY0U1LnBuZyIsIHdpZHRoPTgsIGhlaWdodD04LCBkcGk9NTAwKQ0KYGBgDQojIyMjc2hvb3QgaW5jDQoNCmBgYHtyLHdpZHRoPTgsIGhlaWdodD04fQ0KQmlvbWFzc1Nob290RTUxPC1CaW9tYXNzSW5jMSU+JQ0KICBmaWx0ZXIoVmFyaWFibGU9PSJQcm9kdWN0aW9uLnN1bTkiKQ0KQmlvbWFzc1Nob290RTUxJT4lDQpnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXkseT1zaG9vdGJpb21hc3MpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KICBmYWNldF93cmFwKH5JRCxuY29sID0gMSkrDQogIGdlb21fcG9pbnQoYWVzKHg9Q2xvY2suVG9kYXksIHk9UHJlZGljdGVkKSxjb2xvdXI9ImdyZWVuIixzaXplPTMpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKGJxdW90ZShib2xkKCdTaG9vdCBETSAoJyprZ35oYV4tMSonKScpKSkrDQogbXl0aGVtZTMNCmBgYA0KDQoNCg0KDQoNCg0KDQpgYGB7cn0NCg0KQmlvbWFzc0luYzEgJT4lDQogIG11dGF0ZShPYnNlcnZlZD1zaG9vdGJpb21hc3MpJT4lDQogICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpJT4lDQogIGdyb3VwX2J5KFZhcmlhYmxlKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgcjIgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbNV0sDQogICMgIHJtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCksMCksDQogICAgcl9ybXNlID0gcm91bmQocm1zZShQcmVkaWN0ZWQsT2JzZXJ2ZWQpL21lYW4oT2JzZXJ2ZWQpKjEwMCwxKSwNCiAgICBuc2UgPSByb3VuZChOU0UoUHJlZGljdGVkLE9ic2VydmVkKSwxKSwNCiAgICBzYiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsxXSwNCiAgbnUgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbMl0sDQogIGxjID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzNdDQogICkgDQojIyMxPTAuNzIsIDAuNzcsIDAuODIsIDAuODcsIDAuOTIsIDAuOTcsIDEuMDIsIDEuMDcsIDEuMTIsIDEuMTcsIDEuMjIsIDEuMjcsIDEuMzIsMS4zNywgMS40MiwgMS41MiwgMS42MiwgMS43Mg0KDQpgYGANCg0KDQojIyNSVUUgdGVzdGluZyBmb3IgcmVncm93dGggY3JvcA0KDQpgYGB7cix3aWR0aD02LCBoZWlnaHQ9OH0NCg0KQmlvbWFzc0RlYzEgPC0gQmlvbWFzcyAlPiUgDQogIGZpbHRlcihFeHBlcmltZW50SUQ9PSJFNSIpJT4lDQogIGZpbHRlcihzaG9vdGJpb21hc3MhPSJOQSIpJT4lDQogIGZpbHRlcihUcmVuZD09IkRlYyIpJT4lDQogIGZpbHRlcihmUEFSIT0wKSU+JQ0KICBmaWx0ZXIoU3RhZ2UhPSJTZWVkbGluZyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoRXhwZXJpbWVudElELFRyZWF0bWVudElELElELENsb2NrLlRvZGF5LFRlYXJ0aCxUcmVuZCxTdGFnZSxHcm93dGhSb3RhdGlvbixzaG9vdGJpb21hc3MsU3RTLFByb2R1Y3Rpb24uc3VtMCxQcm9kdWN0aW9uLnN1bTEsUHJvZHVjdGlvbi5zdW0yLFByb2R1Y3Rpb24uc3VtMyxQcm9kdWN0aW9uLnN1bTNBLFByb2R1Y3Rpb24uc3VtM0IsUHJvZHVjdGlvbi5zdW0zQyxQcm9kdWN0aW9uLnN1bTNELFByb2R1Y3Rpb24uc3VtNCxQcm9kdWN0aW9uLnN1bTRBLFByb2R1Y3Rpb24uc3VtNEIsUHJvZHVjdGlvbi5zdW00QyxQcm9kdWN0aW9uLnN1bTRELFByb2R1Y3Rpb24uc3VtNSxQcm9kdWN0aW9uLnN1bTYsUHJvZHVjdGlvbi5zdW03LFByb2R1Y3Rpb24uc3VtN0EsUHJvZHVjdGlvbi5zdW03QixQcm9kdWN0aW9uLnN1bTdDLFByb2R1Y3Rpb24uc3VtN0QsUHJvZHVjdGlvbi5zdW04LFByb2R1Y3Rpb24uc3VtOEEsUHJvZHVjdGlvbi5zdW04QixQcm9kdWN0aW9uLnN1bThDLFByb2R1Y3Rpb24uc3VtOEQsUHJvZHVjdGlvbi5zdW05LFByb2R1Y3Rpb24uc3VtOUEsUHJvZHVjdGlvbi5zdW05QixQcm9kdWN0aW9uLnN1bTlDLFByb2R1Y3Rpb24uc3VtOUQsUHJvZHVjdGlvbi5zdW0xMCxQcm9kdWN0aW9uLnN1bTExLFByb2R1Y3Rpb24uc3VtMTIsUHJvZHVjdGlvbi5zdW0xMykgJT4lDQogIHRpZHlyOjpnYXRoZXIoIlZhcmlhYmxlIiwiUHJlZGljdGVkIixQcm9kdWN0aW9uLnN1bTM6UHJvZHVjdGlvbi5zdW0xMCkNCiAgI2ZpbHRlcihOYW1lIT0iSXZlcnNlbl85MURlZm9saWF0aW9uTEwifEdyb3d0aFJvdGF0aW9uIT0iMzEiKQ0KICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpDQpCaW9tYXNzRGVjMSAkVmFyaWFibGU8LWZhY3RvcihCaW9tYXNzRGVjMSRWYXJpYWJsZSwgbGV2ZWxzPWMoIlByb2R1Y3Rpb24uc3VtMCIsIlByb2R1Y3Rpb24uc3VtMSIsIlByb2R1Y3Rpb24uc3VtMiIsIlByb2R1Y3Rpb24uc3VtMyIsIlByb2R1Y3Rpb24uc3VtM0EiLCJQcm9kdWN0aW9uLnN1bTNCIiwiUHJvZHVjdGlvbi5zdW0zQyIsIlByb2R1Y3Rpb24uc3VtM0QiLCJQcm9kdWN0aW9uLnN1bTQiLCJQcm9kdWN0aW9uLnN1bTRBIiwiUHJvZHVjdGlvbi5zdW00QiIsIlByb2R1Y3Rpb24uc3VtNEMiLCJQcm9kdWN0aW9uLnN1bTREIiwiUHJvZHVjdGlvbi5zdW01IiwiUHJvZHVjdGlvbi5zdW02IiwiUHJvZHVjdGlvbi5zdW03IiwiUHJvZHVjdGlvbi5zdW03QSIsIlByb2R1Y3Rpb24uc3VtN0IiLCJQcm9kdWN0aW9uLnN1bTdDIiwiUHJvZHVjdGlvbi5zdW03RCIsIlByb2R1Y3Rpb24uc3VtOCIsIlByb2R1Y3Rpb24uc3VtOEEiLCJQcm9kdWN0aW9uLnN1bThCIiwiUHJvZHVjdGlvbi5zdW04QyIsIlByb2R1Y3Rpb24uc3VtOEQiLCJQcm9kdWN0aW9uLnN1bTkiLCJQcm9kdWN0aW9uLnN1bTlBIiwiUHJvZHVjdGlvbi5zdW05QiIsIlByb2R1Y3Rpb24uc3VtOUMiLCJQcm9kdWN0aW9uLnN1bTlEIiwiUHJvZHVjdGlvbi5zdW0xMCIsIlByb2R1Y3Rpb24uc3VtMTEiLCJQcm9kdWN0aW9uLnN1bTEyIiwiUHJvZHVjdGlvbi5zdW0xMyIpKQ0KQmlvbWFzc0RlYzElPiUNCiAgZ2dwbG90KGFlcyh4PXNob290YmlvbWFzcywgeT0gUHJlZGljdGVkLCBjb2xvdXI9IGZhY3RvcihJRCkpKSArDQogIGdlb21fcG9pbnQoc2l6ZT0yKSt0aGVtZV9idygpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJkYXJrZ3JleSIpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxKSArDQogIGNvb3JkX2ZpeGVkKHJhdGlvID0gMSkrDQogIGdndGl0bGUoIlNob290IGJpb21hc3MgKERlYykiKSsNCiAgZmFjZXRfd3JhcCh+VmFyaWFibGUsIG5jb2wgPSA2KSsNCiAgdGhlbWVfYncoKStteXRoZW1lMysNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwMCw4MDAwLCBieSA9MzAwMCksIGxpbWl0cz1jKDAsODAwMCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDAsIDYwMDAsIGJ5ID0yMDAwKSwgbGltaXRzPWMoMCw4MDAwKSkrDQogIHlsYWIoIlByZWRpY3RlZCIpK3hsYWIoIk9ic2VydmVkIikrIA0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpDQogZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1JVRXNob290RGVjRTUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTgsIGRwaT01MDApDQpgYGANCiMjI3Nob290IERlYw0KDQpgYGB7cix3aWR0aD04LCBoZWlnaHQ9OH0NCkJpb21hc3NTaG9vdEU1MjwtQmlvbWFzc0RlYzElPiUNCiAgZmlsdGVyKFZhcmlhYmxlPT0iUHJvZHVjdGlvbi5zdW00QSIpDQpCaW9tYXNzU2hvb3RFNTIlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PXNob290YmlvbWFzcykpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogIGZhY2V0X3dyYXAofklELG5jb2wgPSAxKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSwgeT1QcmVkaWN0ZWQpLGNvbG91cj0iZ3JlZW4iLHNpemU9MykrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoYnF1b3RlKGJvbGQoJ1Nob290IERNICgnKmtnfmhhXi0xKicpJykpKSsNCiBteXRoZW1lMw0KYGBgDQojIyNDb21iaW5lIGluY3JlYXNpbmYgYW5kIGRlY3JlYXNpbmcgc2hvb3QgYmlvbWFzcw0KYGBge3Isd2lkdGg9OCwgaGVpZ2h0PTZ9DQpCaW9tYXNzU2hvb3RFNTwtcmJpbmQoQmlvbWFzc1Nob290RTUxLEJpb21hc3NTaG9vdEU1MikNCg0KQmlvbWFzc1Nob290RTUlPiUNCmdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PXNob290YmlvbWFzcykpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogIGZhY2V0X3dyYXAofklELG5jb2wgPSAxKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1DbG9jay5Ub2RheSwgeT1QcmVkaWN0ZWQpLGNvbG91cj0iZ3JlZW4iLHNpemU9MykrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoYnF1b3RlKGJvbGQoJ1Nob290IERNICgnKmtnfmhhXi0xKicpJykpKSsNCiBteXRoZW1lMw0KDQpnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvU2hvb3RiaW9tYXNzRTUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTgsIGRwaT01MDApDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpCaW9tYXNzRGVjMSAlPiUNCiAgbXV0YXRlKE9ic2VydmVkPXNob290YmlvbWFzcyklPiUNCiAgICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZERkQ1IiklPiUNCiAgZ3JvdXBfYnkoVmFyaWFibGUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbiA9IG4oKSwNCiAgICByMiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVs1XSwNCiAgIyAgcm1zZSA9IHJvdW5kKHJtc2UoUHJlZGljdGVkLE9ic2VydmVkKSwwKSwNCiAgICByX3Jtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCkvbWVhbihPYnNlcnZlZCkqMTAwLDEpLA0KICAgIG5zZSA9IHJvdW5kKE5TRShQcmVkaWN0ZWQsT2JzZXJ2ZWQpLDEpLA0KICAgIHNiID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzFdLA0KICBudSA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsyXSwNCiAgbGMgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbM10NCiAgKSANCiMjIzE9MC44MiwwLjkyLCAxLjAyLCAxLjEyLCAxLjIyLCAxLjMyLCAxLjQyLCAxLjUyLDEuNjIsIDEuNzINCg0KYGBgDQojIyNSVUUgdGVzdGluZyBmb3Igc2VlZGxpbmcgY3JvcA0KDQpgYGB7cix3aWR0aD04LCBoZWlnaHQ9OH0NCg0KQmlvbWFzc1NlZWRsaW5nIDwtIEJpb21hc3MgJT4lIA0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTUiKSU+JQ0KICBmaWx0ZXIoc2hvb3RiaW9tYXNzIT0iTkEiKSU+JQ0KICAjZmlsdGVyKFRyZW5kPT0iRGVjIiklPiUNCiAgZmlsdGVyKGZQQVIhPTApJT4lDQogIGZpbHRlcihTdGFnZT09IlNlZWRsaW5nIiklPiUNCiAgZHBseXI6OnNlbGVjdChFeHBlcmltZW50SUQsVHJlYXRtZW50SUQsSUQsQ2xvY2suVG9kYXksVGVhcnRoLFRyZW5kLFN0YWdlLEdyb3d0aFJvdGF0aW9uLHNob290YmlvbWFzcyxTdFMsUHJvZHVjdGlvbi5zdW0wLFByb2R1Y3Rpb24uc3VtMSxQcm9kdWN0aW9uLnN1bTIsUHJvZHVjdGlvbi5zdW0zLFByb2R1Y3Rpb24uc3VtM0EsUHJvZHVjdGlvbi5zdW0zQixQcm9kdWN0aW9uLnN1bTNDLFByb2R1Y3Rpb24uc3VtM0QsUHJvZHVjdGlvbi5zdW00LFByb2R1Y3Rpb24uc3VtNEEsUHJvZHVjdGlvbi5zdW00QixQcm9kdWN0aW9uLnN1bTRDLFByb2R1Y3Rpb24uc3VtNEQsUHJvZHVjdGlvbi5zdW01LFByb2R1Y3Rpb24uc3VtNixQcm9kdWN0aW9uLnN1bTcpICU+JQ0KICB0aWR5cjo6Z2F0aGVyKCJWYXJpYWJsZSIsIlByZWRpY3RlZCIsUHJvZHVjdGlvbi5zdW0wOlByb2R1Y3Rpb24uc3VtNykNCiAgI2ZpbHRlcihOYW1lIT0iSXZlcnNlbl85MURlZm9saWF0aW9uTEwifEdyb3d0aFJvdGF0aW9uIT0iMzEiKQ0KICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpDQpCaW9tYXNzU2VlZGxpbmcgJFZhcmlhYmxlPC1mYWN0b3IoQmlvbWFzc1NlZWRsaW5nJFZhcmlhYmxlLCBsZXZlbHM9YygiUHJvZHVjdGlvbi5zdW0wIiwiUHJvZHVjdGlvbi5zdW0xIiwiUHJvZHVjdGlvbi5zdW0yIiwiUHJvZHVjdGlvbi5zdW0zIiwiUHJvZHVjdGlvbi5zdW0zQSIsIlByb2R1Y3Rpb24uc3VtM0IiLCJQcm9kdWN0aW9uLnN1bTNDIiwiUHJvZHVjdGlvbi5zdW0zRCIsIlByb2R1Y3Rpb24uc3VtNCIsIlByb2R1Y3Rpb24uc3VtNEEiLCJQcm9kdWN0aW9uLnN1bTRCIiwiUHJvZHVjdGlvbi5zdW00QyIsIlByb2R1Y3Rpb24uc3VtNEQiLCJQcm9kdWN0aW9uLnN1bTUiLCJQcm9kdWN0aW9uLnN1bTYiLCJQcm9kdWN0aW9uLnN1bTciLCJQcm9kdWN0aW9uLnN1bTdBIiwiUHJvZHVjdGlvbi5zdW03QiIsIlByb2R1Y3Rpb24uc3VtN0MiLCJQcm9kdWN0aW9uLnN1bTdEIiwiUHJvZHVjdGlvbi5zdW04IiwiUHJvZHVjdGlvbi5zdW04QSIsIlByb2R1Y3Rpb24uc3VtOEIiLCJQcm9kdWN0aW9uLnN1bThDIiwiUHJvZHVjdGlvbi5zdW04RCIsIlByb2R1Y3Rpb24uc3VtOSIsIlByb2R1Y3Rpb24uc3VtOUEiLCJQcm9kdWN0aW9uLnN1bTlCIiwiUHJvZHVjdGlvbi5zdW05QyIsIlByb2R1Y3Rpb24uc3VtOUQiLCJQcm9kdWN0aW9uLnN1bTEwIiwiUHJvZHVjdGlvbi5zdW0xMSIsIlByb2R1Y3Rpb24uc3VtMTIiLCJQcm9kdWN0aW9uLnN1bTEzIikpDQoNCg0KQmlvbWFzc1NlZWRsaW5nJT4lDQogIGdncGxvdChhZXMoeD1zaG9vdGJpb21hc3MsIHk9IFByZWRpY3RlZCwgY29sb3VyPSBmYWN0b3IoSUQpKSkgKw0KICBnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkgKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDEpKw0KICBnZ3RpdGxlKCJTaG9vdCBiaW9tYXNzIChTZWVkbGluZykiKSsNCiAgZmFjZXRfd3JhcCh+VmFyaWFibGUsIG5jb2wgPSA2KSsNCiAgdGhlbWVfYncoKStteXRoZW1lMysNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwMCw4MDAwLCBieSA9MzAwMCksIGxpbWl0cz1jKDAsODAwMCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDAsIDYwMDAsIGJ5ID0yMDAwKSwgbGltaXRzPWMoMCw4MDAwKSkrDQogIHlsYWIoIlByZWRpY3RlZCIpK3hsYWIoIk9ic2VydmVkIikgKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpDQogZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1JVRVNlZWRsaW5nLnBuZyIsIHdpZHRoPTgsIGhlaWdodD04LCBkcGk9NTAwKQ0KYGBgDQoNCmBgYHtyfQ0KDQpCaW9tYXNzU2VlZGxpbmcgJT4lDQogIG11dGF0ZShPYnNlcnZlZD1zaG9vdGJpb21hc3MpJT4lDQogICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpJT4lDQogIGdyb3VwX2J5KFZhcmlhYmxlKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgcjIgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbNV0sDQogICMgIHJtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCksMCksDQogICAgcl9ybXNlID0gcm91bmQocm1zZShQcmVkaWN0ZWQsT2JzZXJ2ZWQpL21lYW4oT2JzZXJ2ZWQpKjEwMCwxKSwNCiAgICBuc2UgPSByb3VuZChOU0UoUHJlZGljdGVkLE9ic2VydmVkKSwxKSwNCiAgICBzYiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsxXSwNCiAgbnUgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbMl0sDQogIGxjID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzNdDQogICkgDQojIyMxPTAuODIsMC45MiwgMS4wMiwgMS4xMiwgMS4yMiwgMS4zMiwgMS40MiwgMS41MiwxLjYyLCAxLjcyDQoNCmBgYA0KDQojIyMjUm9vdCBwcmVkaWN0ZWQgZm9yIEUzDQpgYGB7cix3aWR0aD04LCBoZWlnaHQ9Nn0NCg0KQmlvbWFzc1Jvb3QgPC0gQmlvbWFzcyAlPiUgDQogIGZpbHRlcihFeHBlcmltZW50SUQ9PSJFMyIpJT4lDQogIGZpbHRlcihSb290V3QhPSJOQSIpJT4lDQogICNmaWx0ZXIoU3RhZ2UhPSJTZWVkbGluZyIpJT4lDQogIGRwbHlyOjpzZWxlY3QoRXhwZXJpbWVudElELFRyZWF0bWVudElELElELENsb2NrLlRvZGF5LFRlYXJ0aCxUcmVuZCwgU3RhZ2UsR3Jvd3RoUm90YXRpb24sUm9vdFd0LFN0UyxUb3RhbEJpb21hc3MsUHJvb3QuMC4wNDUuLCBQcm9vdDEuMC4wMy4sUHJvb3QyLjAuMDEuLFByb290My4wLjAwNS4sUHJvb3Q0LjAuMDAzLixQcm9vdDUuMC4wMDIuLFByb290Ni4wLjAwMDUuLFByb290Ny4wLjAwMDUuLFByb290OC4wLjIuLFByb290OS4wLjI1LikgJT4lDQogIHRpZHlyOjpnYXRoZXIoIlZhcmlhYmxlIiwiUHJlZGljdGVkIixQcm9vdC4wLjA0NS46UHJvb3Q5LjAuMjUuKQ0KICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTCJ8R3Jvd3RoUm90YXRpb24hPSIzMSIpDQogICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZERkQ1IikNCkJpb21hc3NSb290ICRWYXJpYWJsZTwtZmFjdG9yKEJpb21hc3NSb290JFZhcmlhYmxlLCBsZXZlbHM9YygiUHJvb3QuMC4wNDUuIiwgIlByb290MS4wLjAzLiIsIlByb290Mi4wLjAxLiIsIlByb290My4wLjAwNS4iLCJQcm9vdDQuMC4wMDMuIiwiUHJvb3Q1LjAuMDAyLiIsIlByb290Ni4wLjAwMDUuIiwiUHJvb3Q3LjAuMDAwNS4iLCJQcm9vdDguMC4yLiIsIlByb290OS4wLjI1LiIpKQ0KDQpCaW9tYXNzUm9vdCU+JQ0KICBnZ3Bsb3QoYWVzKHg9Um9vdFd0LCB5PSBQcmVkaWN0ZWQsIGNvbG91cj0gZmFjdG9yKElEKSkpICsNCiAgZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImRhcmtncmV5IikgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEpICsNCiAgY29vcmRfZml4ZWQocmF0aW8gPSAxKSsNCiAgZ2d0aXRsZSgiUm9vdCBiaW9tYXNzIChFMykiKSsNCiAgZmFjZXRfd3JhcCh+VmFyaWFibGUsIG5jb2wgPSA0KSsNCiAgdGhlbWVfYncoKStteXRoZW1lMysNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwMCw4MDAwLCBieSA9MzAwMCksIGxpbWl0cz1jKDAsODAwMCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDAsIDYwMDAsIGJ5ID0yMDAwKSwgbGltaXRzPWMoMCw4MDAwKSkrDQogIHlsYWIoIlByZWRpY3RlZCIpK3hsYWIoIk9ic2VydmVkIikgKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpDQogZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RXdEUzLnBuZyIsIHdpZHRoPTgsIGhlaWdodD04LCBkcGk9NTAwKQ0KYGBgDQoNCmBgYHtyfQ0KDQpCaW9tYXNzUm9vdCAlPiUNCiAgbXV0YXRlKE9ic2VydmVkPVJvb3RXdCklPiUNCiAgICNmaWx0ZXIoTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25ISEZERkQ1IiklPiUNCiAgZ3JvdXBfYnkoVmFyaWFibGUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbiA9IG4oKSwNCiAgICByMiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVs1XSwNCiAgIyAgcm1zZSA9IHJvdW5kKHJtc2UoUHJlZGljdGVkLE9ic2VydmVkKSwwKSwNCiAgICByX3Jtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCkvbWVhbihPYnNlcnZlZCkqMTAwLDEpLA0KICAgIG5zZSA9IHJvdW5kKE5TRShQcmVkaWN0ZWQsT2JzZXJ2ZWQpLDEpLA0KICAgIHNiID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzFdLA0KICBudSA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsyXSwNCiAgbGMgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbM10NCiAgKSANCiMjIzE9MC44MiwwLjkyLCAxLjAyLCAxLjEyLCAxLjIyLCAxLjMyLCAxLjQyLCAxLjUyLDEuNjIsIDEuNzINCg0KYGBgDQpgYGB7cn0NCkJpb21hc3NSb290JT4lDQogIGZpbHRlcihFeHBlcmltZW50SUQ9PSJFMyIpJT4lDQogIGZpbHRlcihSb290V3QhPSJOQSIpJT4lDQogIGZpbHRlcihWYXJpYWJsZT09IlByb290OS4wLjI1LiIpJT4lDQogIGdncGxvdChhZXMoeD1DbG9jay5Ub2RheSx5PVByZWRpY3RlZCkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrDQogZmFjZXRfd3JhcCh+SUQsbmNvbCA9IDIpKw0KIGdlb21fcG9pbnQoYWVzKHg9Q2xvY2suVG9kYXksIHk9Um9vdFd0KSxjb2xvdXI9ImdyZWVuIixzaXplPTMpK215dGhlbWUzKw0KIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikreGxhYigiRGF0ZSIpK3lsYWIoYnF1b3RlKGJvbGQoJ1Jvb3QgRE0gKCcqa2d+aGFeLTEqJyknKSkpDQogIGdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9Sb290V3RwcmVkaWN0ZWRFMy5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCmBgYA0KDQojIyMjUm9vdCBwcmVkaWN0ZWQgZm9yIEU1DQpgYGB7cix3aWR0aD04LCBoZWlnaHQ9Nn0NCg0KQmlvbWFzc1Jvb3QxIDwtIEJpb21hc3MgJT4lIA0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTUiKSU+JQ0KICBmaWx0ZXIoUm9vdFd0IT0iTkEiKSU+JQ0KICAjZmlsdGVyKFN0YWdlIT0iU2VlZGxpbmciKSU+JQ0KICBkcGx5cjo6c2VsZWN0KEV4cGVyaW1lbnRJRCxUcmVhdG1lbnRJRCxJRCxDbG9jay5Ub2RheSxUZWFydGgsVHJlbmQsIFN0YWdlLEdyb3d0aFJvdGF0aW9uLFJvb3RXdCxTdFMsVG90YWxCaW9tYXNzLFByb290LjAuMDQ1LiwgUHJvb3QxLjAuMDMuLFByb290Mi4wLjAxLixQcm9vdDMuMC4wMDUuLFByb290NC4wLjAwMy4sUHJvb3Q1LjAuMDAyLixQcm9vdDYuMC4wMDA1LixQcm9vdDcuMC4wMDA1LixQcm9vdDguMC4yLixQcm9vdDkuMC4yNS4pICU+JQ0KICB0aWR5cjo6Z2F0aGVyKCJWYXJpYWJsZSIsIlByZWRpY3RlZCIsUHJvb3QuMC4wNDUuOlByb290OS4wLjI1LikNCiAgI2ZpbHRlcihOYW1lIT0iSXZlcnNlbl85MURlZm9saWF0aW9uTEwifEdyb3d0aFJvdGF0aW9uIT0iMzEiKQ0KICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpDQpCaW9tYXNzUm9vdCAkVmFyaWFibGU8LWZhY3RvcihCaW9tYXNzUm9vdCRWYXJpYWJsZSwgbGV2ZWxzPWMoIlByb290LjAuMDQ1LiIsICJQcm9vdDEuMC4wMy4iLCJQcm9vdDIuMC4wMS4iLCJQcm9vdDMuMC4wMDUuIiwiUHJvb3Q0LjAuMDAzLiIsIlByb290NS4wLjAwMi4iLCJQcm9vdDYuMC4wMDA1LiIsIlByb290Ny4wLjAwMDUuIiwiUHJvb3Q4LjAuMi4iLCJQcm9vdDkuMC4yNS4iKSkNCg0KQmlvbWFzc1Jvb3QxJT4lDQogIGdncGxvdChhZXMoeD1Sb290V3QsIHk9IFByZWRpY3RlZCwgY29sb3VyPSBmYWN0b3IoSUQpKSkgKw0KICBnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkgKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDEpKw0KICBnZ3RpdGxlKCJSb290IGJpb21hc3MgKEU1KSIpKw0KICBmYWNldF93cmFwKH5WYXJpYWJsZSwgbmNvbCA9IDQpKw0KICB0aGVtZV9idygpK215dGhlbWUzKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDAwLDgwMDAsIGJ5ID0zMDAwKSwgbGltaXRzPWMoMCw4MDAwKSkrDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwMCwgNjAwMCwgYnkgPTIwMDApLCBsaW1pdHM9YygwLDgwMDApKSsNCiAgeWxhYigiUHJlZGljdGVkIikreGxhYigiT2JzZXJ2ZWQiKSArDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikNCiBnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvUm9vdFd0RTUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQpgYGANCmBgYHtyfQ0KDQpCaW9tYXNzUm9vdDEgJT4lDQogIG11dGF0ZShPYnNlcnZlZD1Sb290V3QpJT4lDQogICAjZmlsdGVyKE5hbWUhPSJJdmVyc2VuXzEyMURlZm9saWF0aW9uSEhGREZENSIpJT4lDQogIGdyb3VwX2J5KFZhcmlhYmxlKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgcjIgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbNV0sDQogICMgIHJtc2UgPSByb3VuZChybXNlKFByZWRpY3RlZCxPYnNlcnZlZCksMCksDQogICAgcl9ybXNlID0gcm91bmQocm1zZShQcmVkaWN0ZWQsT2JzZXJ2ZWQpL21lYW4oT2JzZXJ2ZWQpKjEwMCwxKSwNCiAgICBuc2UgPSByb3VuZChOU0UoUHJlZGljdGVkLE9ic2VydmVkKSwxKSwNCiAgICBzYiA9IGdhdWNoU3RhdHMoUHJlZGljdGVkLE9ic2VydmVkKVsxXSwNCiAgbnUgPSBnYXVjaFN0YXRzKFByZWRpY3RlZCxPYnNlcnZlZClbMl0sDQogIGxjID0gZ2F1Y2hTdGF0cyhQcmVkaWN0ZWQsT2JzZXJ2ZWQpWzNdDQogICkgDQojIyMxPTAuODIsMC45MiwgMS4wMiwgMS4xMiwgMS4yMiwgMS4zMiwgMS40MiwgMS41MiwxLjYyLCAxLjcyDQoNCmBgYA0KDQpgYGB7cn0NCkJpb21hc3NSb290MSU+JQ0KICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTUiKSU+JQ0KICBmaWx0ZXIoUm9vdFd0IT0iTkEiKSU+JQ0KICBmaWx0ZXIoVmFyaWFibGU9PSJQcm9vdDkuMC4yNS4iKSU+JQ0KICBnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXkseT1QcmVkaWN0ZWQpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpKw0KIGZhY2V0X3dyYXAofklELG5jb2wgPSAyKSsNCiBnZW9tX3BvaW50KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RXdCksY29sb3VyPSJncmVlbiIsc2l6ZT0zKStteXRoZW1lMysNCiB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpK3hsYWIoIkRhdGUiKSt5bGFiKGJxdW90ZShib2xkKCdSb290IERNICgnKmtnfmhhXi0xKicpJykpKQ0KICBnZ3NhdmUoIkQ6L1IvUGljdHVyZXMvQzUvWWllbGQvUm9vdFd0cHJlZGljdGVkRTUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTYsIGRwaT01MDApDQpgYGANCg0KDQoNCg0KDQojIyMjI2F2ZXJhZ2Ugb2YgcGFydGl0aW9uaW5nIHJhdGUNCiMjIyNhdmVyYWdlIG9mIGN1dHRpbmcgdHJlYXRtZW50DQpgYGB7cixoZWlnaHQ9NCwgZmlnLndpZHRoPTh9DQoNCkJpb21hc3MyPC1CaW9tYXNzJT4lDQogIGZpbHRlcihQYXJ0aXRpb25pbmchPSJOQSIpJT4lDQogIGdyb3VwX2J5KEdyb3d0aFNlYXNvbixSb3RhdGlvbixHcm93dGhSb3RhdGlvbixUbWVhbixQcG0sU3RhZ2UsVHJlbmQsSUQsRXhwZXJpbWVudElEKSAlPiUNCiAgZG8obW9kMSA9IGxtKFN0b3JhZ2UyflR0X2Jyb2tlbl9zdW0sZGF0YT0uKSkgJT4lDQogIG11dGF0ZShQUmF0ZTEgPSBzdW1tYXJ5KG1vZDEpJGNvZWZmWzJdKSAlPiUNCiAgZHBseXI6OnNlbGVjdCgtbW9kMSkNCiANCg0KbGlicmFyeShwbHlyKQ0KDQpsbV9lcW4xIDwtIGZ1bmN0aW9uKEJpb21hc3MyKXsNCiAgbSA8LSBsbShQUmF0ZTF+UHBtICxCaW9tYXNzMik7DQogIGVxIDwtIHN1YnN0aXR1dGUoaXRhbGljKHkpID09IFBwbSArUFJhdGUxICUuJSBpdGFsaWMoUFJhdGUxKSoiLCJ+fml0YWxpYyhSKV4yfiI9In5yMiwgDQogICAgICAgICAgICAgICAgICAgbGlzdChQcG0gPSBmb3JtYXQoY29lZihtKVsxXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgUFJhdGUxPSBmb3JtYXQoY29lZihtKVsyXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkNCiAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCmVxcyA8LSBkZHBseShCaW9tYXNzMiwuKFRyZW5kLFN0YWdlKSxsbV9lcW4xKQ0KI2RmMiA8LSBkYXRhLmZyYW1lKGVxID0gdW5jbGFzcyhlcW5zKSwgQ29sbGVjdGlvbiA9IGFzLm51bWVyaWMobmFtZXMoZXFucykpKQ0KI3lsYWIoYnF1b3RlKGJvbGQoJ0xFQVIgKCcqbV4yfm1eLTJ+J7BDZCdeLTEqJyknKSkpDQoNCg0KQmlvbWFzczIlPiUNCiAgZ2dwbG90KGFlcyh4PVBwbSwgeT1QUmF0ZTEsY29sb3I9SUQpKStnZW9tX3BvaW50KHNpemU9MSkrdGhlbWVfYncoKStteXRoZW1lMysNCiAgZmFjZXRfZ3JpZChTdGFnZX5UcmVuZCkgKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iZGFya2dyZXkiKSArDQogIGdlb21fdGV4dChkYXRhID0gZXFzLCBhZXMoeCA9MTMuNSwgeSA9IDI1LCBsYWJlbCA9IFYxKSwgDQogICAgICAgICAgY29sb3IgPSAnYmxhY2snLCAgcGFyc2UgPSBUUlVFLCBzaXplPTUpK3hsYWIoIk1lYW4gcGhvdG9wZXJpb2QgKGgpIikrDQogIHlsYWIoYnF1b3RlKGJvbGQoJ1Jvb3Qgc3RvcmFnZSByYXRlICgnKidrZyd+J2hhJ14tMX4nsENkJ14tMSonKScpKSkNCg0KDQogZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RHcm93dGhSYXRlMS5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NCwgZHBpPTUwMCkNCg0KZGV0YWNoKHBhY2thZ2U6cGx5cikNCmBgYA0KDQojIyMjUm9vdCBncm93dGggcmF0ZSBmb3IgZGl2aWR1YWwgZXhwZXJpbWVudA0KYGBge3IsaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0NCg0KQmlvbWFzczM8LUJpb21hc3MlPiUNCmZpbHRlcihJRD09IkU1SUxMRjUiKSU+JQ0KICBmaWx0ZXIoUGFydGl0aW9uaW5nIT0iTkEiKSU+JQ0KICBtdXRhdGUoUGFydC5SYXRlPVBhcnRpdGlvbmluZy9UdF9icm9rZW5fc3VtKSU+JQ0KICAgZmlsdGVyKFBhcnQuUmF0ZT4wKSU+JQ0KICBnZ3Bsb3QoYWVzKHg9VHRfYnJva2VuX3N1bSwgeT1QYXJ0LlJhdGUsY29sb3I9SUQpKStnZW9tX3BvaW50KHNpemU9MSkrDQogIGZhY2V0X2dyaWQoR3Jvd3RoU2Vhc29uflJvdGF0aW9uKSArIHRoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImRhcmtncmV5IikgDQogICNnZW9tX3BvaW50KGFlcyh5PVJvb3RXdCxzaXplPTIpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFJlc3BpcmF0aW9uMikNCg0KYGBgDQoNCg0KDQoNCiMjIyMjIGludGVyY2VwdHVsYXRlIHBhcnRpb25pbmcgcmF0ZQ0KIyMjZ29vZCBlZmZvcnQgYnV0IE5vISEhISEhDQpgYGB7cn0NCiMjI2ZQQVIgaW50ZXJwb2xhdGUgZm9yIGVhY2ggcm90YXRpb24NCg0KIyBVbmlFeHAgPC0gdW5pcXVlKEJpb21hc3MuTEwkRXhwTmFtZSkNCiMgDQojIEJpb21hc3MuTEwuZGYgPC0gZGF0YS5mcmFtZSgpDQojICAgDQojIGZvcihpIGluIDE6bGVuZ3RoKFVuaUV4cCkpDQojIHsNCiMgICANCiMgIEJpb21hc3MuTEwuZXg8LUJpb21hc3MuTEwgJT4lDQojICAgbXV0YXRlKFBQUj1hcHByb3goQ2xvY2suVG9kYXksUGFydGl0aW9uaW5nUmF0ZTIsIHhvdXQgPUNsb2NrLlRvZGF5LCANCiMgICAgICAgICAgbWV0aG9kPSJsaW5lYXIiLCANCiMgICAgICAgICAgcnVsZSA9IDIpJHkpICAgICMjaW50ZXJwb2xhdGUgZnVuY3Rpb24NCiMgQmlvbWFzcy5MTC5kZjwtIHJiaW5kKCBCaW9tYXNzLkxMLmV4LCBCaW9tYXNzLkxMLmRmKQ0KIyANCiMgfQ0KIyANCiMgQmlvbWFzcy5MTC5kZiANCiMgd3JpdGUuY3N2KEJpb21hc3MuTEwuZGYgLCJEOi9SL1Jlc3BpcmF0aW9uL0Jpb21hc3MuTEwuZGYgLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KYGBgDQojIyMjQ2FsY3VsYXRlZCBSVUUNCmBgYHtyLGhlaWdodD02LCBmaWcud2lkdGg9OH0NClJVRVQ8LUJpb21hc3MlPiUNCiAgZmlsdGVyKFJvb3RXdCE9Ik5BIiklPiUNCiAgZmlsdGVyKFRvdGFsQmlvbWFzcyE9Ik5BIikNCg0KUlVFRTM8LVJVRVQlPiUNCiAgZmlsdGVyKEV4cGVyaW1lbnRJRD09IkU1IiklPiUNCiAgbXV0YXRlKFJvb3RXdD1Sb290V3QvMC44KSU+JQ0KICBtdXRhdGUoVG90YWxCaW9tYXNzPVJvb3RXdCtzaG9vdGJpb21hc3MpJT4lDQogIG11dGF0ZShUb3RhbEJpb21hc3MxPVRvdGFsQmlvbWFzcyowLjEpDQoNClJVRTU8LVJVRVQlPiUNCiAgZmlsdGVyKEV4cGVyaW1lbnRJRD09IkUzIiklPiUNCiAgbXV0YXRlKFRvdGFsQmlvbWFzczE9VG90YWxCaW9tYXNzKjAuMSkNCg0KUlVFPC1yYmluZChSVUVFMyxSVUU1KQ0KIA0KDQpSVUUlPiUNCiAgZmlsdGVyKElEPT0iRTNJTEwiKSU+JQ0KICBnZ3Bsb3QoYWVzKHg9QWNjUEFSaSx5PVRvdGFsQmlvbWFzczEpKStnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgICB4bGFiKGJxdW90ZShib2xkKCdBY2N1bXVsYXRlZCBQQVJpICgnKk1Kfm1eLTIqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1RvdGFsIERNICgnKmd+RE1+bV4tMionKScpKSkrDQogICAgZ2d0aXRsZSgiRTNJTEwiKSAgKw0KIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImJsdWUiKSsNCiBmYWNldF9ncmlkKEdyb3d0aFNlYXNvbn5Sb3RhdGlvbikrbXl0aGVtZTMrDQpzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDE2MDAsIGJ5ID02MDApLCBsaW1pdHM9YygwLDE2MDApKSsNCiBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMCwgODAwLCBieSA9NDAwKSwgbGltaXRzPWMoMCw4MDApKQ0KDQoNCmBgYA0KDQpgYGB7cixoZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpSVUUlPiUNCiAgZmlsdGVyKElEPT0iRTNJTFMiKSU+JQ0KICBnZ3Bsb3QoYWVzKHg9QWNjUEFSaSx5PVRvdGFsQmlvbWFzczEpKStnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgICB4bGFiKGJxdW90ZShib2xkKCdBY2N1bXVsYXRlZCBQQVJpICgnKk1Kfm1eLTIqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1RvdGFsIERNICgnKmd+RE1+bV4tMionKScpKSkrDQogICAgZ2d0aXRsZSgiRTNJTFMiKSAgKw0KIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImJsdWUiKSsNCiBmYWNldF9ncmlkKEdyb3d0aFNlYXNvbn5Sb3RhdGlvbikrbXl0aGVtZTMrDQpzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDE2MDAsIGJ5ID02MDApLCBsaW1pdHM9YygwLDE2MDApKSsNCiBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMCwgODAwLCBieSA9NDAwKSwgbGltaXRzPWMoMCw4MDApKQ0KDQpgYGANCg0KYGBge3IsaGVpZ2h0PTYsIGZpZy53aWR0aD04fQ0KUlVFJT4lDQogIGZpbHRlcihJRD09IkUzSVNMIiklPiUNCiAgZ2dwbG90KGFlcyh4PUFjY1BBUmkseT1Ub3RhbEJpb21hc3MxKSkrZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrDQogICAgeGxhYihicXVvdGUoYm9sZCgnQWNjdW11bGF0ZWQgUEFSaSAoJypNSn5tXi0yKicpJykpKSt5bGFiKGJxdW90ZShib2xkKCdUb3RhbCBETSAoJypnfkRNfm1eLTIqJyknKSkpKw0KICAgIGdndGl0bGUoIkUzSVNMIikgICsNCiBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJibHVlIikrDQogZmFjZXRfZ3JpZChHcm93dGhTZWFzb25+Um90YXRpb24pK215dGhlbWUzKw0Kc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxNjAwLCBieSA9NjAwKSwgbGltaXRzPWMoMCwxNjAwKSkrDQogc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDAsIDgwMCwgYnkgPTQwMCksIGxpbWl0cz1jKDAsODAwKSkNCg0KYGBgDQpgYGB7cixoZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpSVUUlPiUNCiAgZmlsdGVyKElEPT0iRTNJU1MiKSU+JQ0KICBnZ3Bsb3QoYWVzKHg9QWNjUEFSaSx5PVRvdGFsQmlvbWFzczEpKStnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgICB4bGFiKGJxdW90ZShib2xkKCdBY2N1bXVsYXRlZCBQQVJpICgnKk1Kfm1eLTIqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1RvdGFsIERNICgnKmd+RE1+bV4tMionKScpKSkrDQogICAgZ2d0aXRsZSgiRTNJU1MiKSAgKw0KIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImJsdWUiKSsNCiBmYWNldF9ncmlkKEdyb3d0aFNlYXNvbn5Sb3RhdGlvbikrbXl0aGVtZTMrDQpzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDgwMCwgYnkgPTMwMCksIGxpbWl0cz1jKDAsODAwKSkrDQogc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDAsIDgwMCwgYnkgPTQwMCksIGxpbWl0cz1jKDAsODAwKSkNCg0KYGBgDQoNCmBgYHtyLGhlaWdodD02LCBmaWcud2lkdGg9OH0NClJVRSU+JQ0KICBmaWx0ZXIoSUQ9PSJFNUlISEY1IiklPiUNCiAgZ2dwbG90KGFlcyh4PUFjY1BBUmkseT1Ub3RhbEJpb21hc3MxKSkrZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrDQogICAgeGxhYihicXVvdGUoYm9sZCgnQWNjdW11bGF0ZWQgUEFSaSAoJypNSn5tXi0yKicpJykpKSt5bGFiKGJxdW90ZShib2xkKCdUb3RhbCBETSAoJypnfkRNfm1eLTIqJyknKSkpKw0KICAgIGdndGl0bGUoIkU1SUhIRjUiKSAgKw0KIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImJsdWUiKSsNCiBmYWNldF9ncmlkKEdyb3d0aFNlYXNvbn5Sb3RhdGlvbikrbXl0aGVtZTMrDQpzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDE2MDAsIGJ5ID02MDApLCBsaW1pdHM9YygwLDE2MDApKSsNCiBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMCwgODAwLCBieSA9NDAwKSwgbGltaXRzPWMoMCw4MDApKQ0KDQpgYGANCmBgYHtyLGhlaWdodD02LCBmaWcud2lkdGg9OH0NClJVRSU+JQ0KICBmaWx0ZXIoSUQ9PSJFNUlMTEY1IiklPiUNCiAgZ2dwbG90KGFlcyh4PUFjY1BBUmkseT1Ub3RhbEJpb21hc3MxKSkrZ2VvbV9wb2ludChzaXplPTIpK3RoZW1lX2J3KCkrDQogICAgeGxhYihicXVvdGUoYm9sZCgnQWNjdW11bGF0ZWQgUEFSaSAoJypNSn5tXi0yKicpJykpKSt5bGFiKGJxdW90ZShib2xkKCdUb3RhbCBETSAoJypnfkRNfm1eLTIqJyknKSkpKw0KICAgIGdndGl0bGUoIkU1SUxMRjUiKSAgKw0KIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgbGluZXR5cGUgPSAxLCBjb2xvdXI9ImJsdWUiKSsNCiBmYWNldF9ncmlkKEdyb3d0aFNlYXNvbn5Sb3RhdGlvbikrbXl0aGVtZTMrDQpzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDE2MDAsIGJ5ID02MDApLCBsaW1pdHM9YygwLDE2MDApKSsNCiBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMCwgODAwLCBieSA9NDAwKSwgbGltaXRzPWMoMCw4MDApKQ0KDQpgYGANCg0KYGBge3IsaGVpZ2h0PTYsIGZpZy53aWR0aD04fQ0KUlVFJT4lDQogIGZpbHRlcihJRD09IkU1SVNTRjUiKSU+JQ0KICBnZ3Bsb3QoYWVzKHg9QWNjUEFSaSx5PVRvdGFsQmlvbWFzczEpKStnZW9tX3BvaW50KHNpemU9MikrdGhlbWVfYncoKSsNCiAgICB4bGFiKGJxdW90ZShib2xkKCdBY2N1bXVsYXRlZCBQQVJpICgnKk1Kfm1eLTIqJyknKSkpK3lsYWIoYnF1b3RlKGJvbGQoJ1RvdGFsIERNICgnKmd+RE1+bV4tMionKScpKSkrDQogICAgZ2d0aXRsZSgiRTVJU1NGNSIpICArDQogZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iYmx1ZSIpKw0KIGZhY2V0X2dyaWQoR3Jvd3RoU2Vhc29uflJvdGF0aW9uKStteXRoZW1lMysNCnNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTYwMCwgYnkgPTYwMCksIGxpbWl0cz1jKDAsMTYwMCkpKw0KIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwLCA4MDAsIGJ5ID00MDApLCBsaW1pdHM9YygwLDgwMCkpDQoNCmBgYA0KIyMjUlVFDQoNCmBgYHtyfQ0KUlVFVG90YWw8LVJVRSU+JQ0KZ3JvdXBfYnkoRXhwTmFtZSxHcm93dGhTZWFzb24sUm90YXRpb24sR3Jvd3RoUm90YXRpb24sVG1lYW4sUHBtLFN0YWdlLFRyZW5kLElELEV4cGVyaW1lbnRJRCxEZWZvbGlhdGlvbikgJT4lDQogIGRvKG1vZCA9IGxtKFRvdGFsQmlvbWFzczF+QWNjUEFSaSxkYXRhPS4pKSAlPiUNCiAgbXV0YXRlKFJVRXQgPSBzdW1tYXJ5KG1vZCkkY29lZmZbMl0pICU+JQ0KICBkcGx5cjo6c2VsZWN0KC1tb2QpDQogIA0KYGBgDQoNCmBgYHtyLGhlaWdodD02LCBmaWcud2lkdGg9OH0NClJVRVRvdGFsJFRyZW5kPC0gZmFjdG9yKFJVRVRvdGFsJFRyZW5kLCBsZXZlbHM9YygiSW5jIiwiRGVjIikpDQoNClJVRVRvdGFsMTwtUlVFVG90YWwlPiUNCiAgZHBseXI6OmZpbHRlcihSVUV0PjApJT4lDQogIGRwbHlyOjpmaWx0ZXIoUlVFdDwyKSU+JQ0KICBmaWx0ZXIoRGVmb2xpYXRpb249PSJMTCIpJT4lDQogICBkcGx5cjo6ZmlsdGVyKEV4cE5hbWUhPSJJdmVyc2VuXzkxRGVmb2xpYXRpb25MTEdzXzJSdF82IiklPiUNCiAgZHBseXI6OmZpbHRlcihFeHBOYW1lIT0iSXZlcnNlbl85MURlZm9saWF0aW9uTExHc18yUnRfNyIpJT4lDQogIGRwbHlyOjpmaWx0ZXIoRXhwTmFtZSE9Ikl2ZXJzZW5fMTIxRGVmb2xpYXRpb25MTEZERkQ1R3NfNFJ0XzIiKQ0KICANCg0KbGlicmFyeShwbHlyKQ0KDQpsbV9lcW4yIDwtIGZ1bmN0aW9uKFJVRVRvdGFsMSl7DQogIG0gPC0gbG0oUlVFdH5UbWVhbiAsUlVFVG90YWwxKTsNCiAgZXEgPC0gc3Vic3RpdHV0ZShpdGFsaWMoeSkgPT0gVG1lYW4gK1JVRXQgJS4lIGl0YWxpYyhSVUV0KSoiLCJ+fml0YWxpYyhSKV4yfiI9In5yMiwgDQogICAgICAgICAgICAgICAgICAgbGlzdChUbWVhbiA9IGZvcm1hdChjb2VmKG0pWzFdLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBSVUV0PSBmb3JtYXQoY29lZihtKVsyXSwgZGlnaXRzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkNCiAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCmVxc1JVRSA8LSBkZHBseShSVUVUb3RhbDEsLihTdGFnZSxUcmVuZCksbG1fZXFuMikNCg0KUlVFVG90YWwxJT4lDQogIGZpbHRlcihEZWZvbGlhdGlvbj09IkxMIiklPiUNCiAgZ2dwbG90KGFlcyh4PVRtZWFuLHk9UlVFdCxjb2xvdXI9SUQsbGFiZWw9R3Jvd3RoUm90YXRpb24pKStnZW9tX3RleHQoKSt0aGVtZV9idygpKw0KICAgIHhsYWIoJ01lYW4gdGVtcGVyYXR1cmUgKLBDKScpK3lsYWIoYnF1b3RlKGJvbGQoJ1JVRSAoJypnfk1KXi0xKicpJykpKSsNCiAgICBnZ3RpdGxlKCJFNUlTU0Y1IikgICsNCiBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJibHVlIikrDQogI2ZhY2V0X2dyaWQoU3RhZ2V+VHJlbmQpKw0KICBmYWNldF9ncmlkKFRyZW5kflN0YWdlKSsNCiAgbXl0aGVtZTMrDQpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDEwLCAxOCwgYnkgPTMpLCBsaW1pdHM9YygxMCwxOCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIsIGJ5ID0xKSwgbGltaXRzPWMoMCwyKSkrDQpnZW9tX3RleHQoZGF0YSA9IGVxc1JVRSwgYWVzKHggPTEzLjUsIHkgPSAyLCBsYWJlbCA9IFYxKSwgDQogICAgICAgICAgY29sb3IgPSAnYmxhY2snLCAgcGFyc2UgPSBUUlVFLCBzaXplPTQpDQoNCg0KIGdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9SVUUucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTQsIGRwaT01MDApDQoNCmRldGFjaChwYWNrYWdlOnBseXIpDQoNCg0KYGBgDQoNCg0KDQojIyNwcmVkaWN0ZWQgVnMgb2JzZXJ2ZWQgZm9yIHBhcnRpdGlvbmcgDQpgYGB7cn0NCkJpb21hc3MuTEwlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RQMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQMikpK2dlb21fbGluZShhZXMoeT1Sb290UDMpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQNSkpK2dlb21fbGluZShhZXMoeT1Sb290UDYpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA3KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQOCkpK2dlb21fbGluZShhZXMoeT1Sb290UDkpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFAxMCkpK2dlb21fbGluZShhZXMoeT1Sb290UEEpKSt4bGFiKCJEYXRlIikrDQogIHlsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikNCg0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RHcm93dGhFM0lMTC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NCwgZHBpPTUwMCkNCmBgYA0KIyMjIFJvb3QgcGFydGl0aW9uaW5nIHJhdGUgYW5hbHlzaXMNCmBgYHtyLGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpCaW9tYXNzJFRyZW5kPC1mYWN0b3IoQmlvbWFzcyRUcmVuZCwgbGV2ZWxzPWMoIkluYyIsICJEZWMiKSkNCg0KDQpCaW9tYXNzJT4lICANCiAgZmlsdGVyKFJvb3RSZXNwaXJhdGlvbjEhPSJOQSIpJT4lDQogIGZpbHRlcihQYXJ0aXRpb25pbmdSZXIxPjApJT4lDQogICBmaWx0ZXIoRXhwZXJpbWVudElEPT0iRTMiKSU+JQ0KICBtdXRhdGUoUm90YXRpb249YXMuZmFjdG9yKFJvdGF0aW9uKSxHcm93dGhTZWFzb249YXMuZmFjdG9yKEdyb3d0aFNlYXNvbikpJT4lICAgICAgICAjIyMjUm9vdCBiaW9tYXNzIGp1c3QgZnJvbSByZXNwaXJhdGlvbiAwLjAzDQogIGdncGxvdChhZXMoeD1QcCwgeT1QYXJ0aXRpb25pbmdSZXIxKSkrZ2VvbV9wb2ludChzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGZhY2V0X2dyaWQoSUR+VHJlbmQpK3hsYWIoIlBob3RvcGVyaW9kIChoKSIpKw0KICB5bGFiKCJQcm9vdCIpKw0KICAjc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxMCwgMTcsIGJ5ID0yKSwgbGltaXRzPWMoMTAsMTcpKSsNCiAgI3NjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMC41LCBieSA9MC41KSwgbGltaXRzPWMoMCwwLjUpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBsaW5ldHlwZSA9IDEsIGNvbG91cj0iYmx1ZSIpDQoNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9FMy5Qcm9vdC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NiwgZHBpPTUwMCkNCg0KYGBgDQojIyMgUm9vdCBwYXJ0aXRpb25pbmcgcmF0ZSBhbmFseXNpcw0KYGBge3IsZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0NCkJpb21hc3MkVHJlbmQ8LWZhY3RvcihCaW9tYXNzJFRyZW5kLCBsZXZlbHM9YygiSW5jIiwgIkRlYyIpKQ0KDQoNCkJpb21hc3MlPiUgIA0KICBmaWx0ZXIoUm9vdFJlc3BpcmF0aW9uMSE9Ik5BIiklPiUNCiAgZmlsdGVyKFBhcnRpdGlvbmluZ1JlcjE+MCklPiUNCiAgIGZpbHRlcihFeHBlcmltZW50SUQ9PSJFNSIpJT4lDQogIG11dGF0ZShSb3RhdGlvbj1hcy5mYWN0b3IoUm90YXRpb24pLEdyb3d0aFNlYXNvbj1hcy5mYWN0b3IoR3Jvd3RoU2Vhc29uKSklPiUgICAgICAgICMjIyNSb290IGJpb21hc3MganVzdCBmcm9tIHJlc3BpcmF0aW9uIDAuMDMNCiAgZ2dwbG90KGFlcyh4PVBwLCB5PVBhcnRpdGlvbmluZ1JlcjEpKStnZW9tX3BvaW50KHNpemU9MSkrdGhlbWVfYncoKStteXRoZW1lMysNCiAgZmFjZXRfZ3JpZChJRH5UcmVuZCkreGxhYigiUGhvdG9wZXJpb2QgKGgpIikrDQogIHlsYWIoIlByb290IikrDQogICNzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDEwLCAxNywgYnkgPTIpLCBsaW1pdHM9YygxMCwxNykpKw0KICAjc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAwLjUsIGJ5ID0wLjUpLCBsaW1pdHM9YygwLDAuNSkpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGxpbmV0eXBlID0gMSwgY29sb3VyPSJibHVlIikNCg0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL0U1LlByb290LnBuZyIsIHdpZHRoPTgsIGhlaWdodD02LCBkcGk9NTAwKQ0KYGBgDQoNCg0KIyMjTFMgUm9vdCBhbmFseXNpcw0KYGBge3J9DQpCaW9tYXNzLkxTPC1CaW9tYXNzJT4lDQogIGZpbHRlcihJRD09IkUzSUxTIiklPiUNCiAgZmlsdGVyKFJvb3RSZXNwaXJhdGlvbjEhPSJOQSIpDQpCaW9tYXNzLkxTJT4lDQogIGdncGxvdChhZXMoeD1DbG9jay5Ub2RheSwgeT1Sb290UmVzcGlyYXRpb24xKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKStteXRoZW1lMysNCiAgZ2VvbV9wb2ludChhZXMoeT1Sb290V3Qsc2l6ZT0yKSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RSZXNwaXJhdGlvbjIpKStnZ3RpdGxlKHBhc3RlMCgiRTNJTFMiKSkrDQogeGxhYigiRGF0ZSIpK3lsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikrdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KYGBgDQoNCiMjI3ByZWRpY3RlZCBWcyBvYnNlcnZlZCBmb3IgcGFydGl0aW9uZyANCmBgYHtyfQ0KQmlvbWFzcy5MUyU+JQ0KICBnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXksIHk9Um9vdFAxKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKStteXRoZW1lMysNCiAgZ2VvbV9wb2ludChhZXMoeT1Sb290V3QpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFAyKSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQMykpK2dlb21fbGluZShhZXMoeT1Sb290UDQpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA1KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQNikpK2dlb21fbGluZShhZXMoeT1Sb290UDcpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA4KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQOSkpK2dlb21fbGluZShhZXMoeT1Sb290UDEwKSkreGxhYigiRGF0ZSIpKw0KICB5bGFiKCJSb290IGJpb21hc3MgKGtnL2hhKSIpDQoNCmdnc2F2ZSgiRDovUi9QaWN0dXJlcy9DNS9ZaWVsZC9Sb290R3Jvd3RoRTNJTFMucG5nIiwgd2lkdGg9OCwgaGVpZ2h0PTQsIGRwaT01MDApDQpgYGANCg0KDQojIyMjU0wgcm9vdCBhbmFseXNpcw0KYGBge3J9DQpCaW9tYXNzLlNMPC1CaW9tYXNzJT4lDQogIGZpbHRlcihJRD09IkUzSVNMIiklPiUNCiAgZmlsdGVyKFJvb3RSZXNwaXJhdGlvbjEhPSJOQSIpDQpCaW9tYXNzLlNMJT4lDQogIGdncGxvdChhZXMoeD1DbG9jay5Ub2RheSwgeT1Sb290UmVzcGlyYXRpb24xKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKStteXRoZW1lMysNCiAgZ2VvbV9wb2ludChhZXMoeT1Sb290V3Qsc2l6ZT0yKSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RSZXNwaXJhdGlvbjIpKStnZ3RpdGxlKHBhc3RlMCgiRTNJU0wiKSkrDQogeGxhYigiRGF0ZSIpK3lsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikrdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KYGBgICAgDQoNCiMjI3ByZWRpY3RlZCB2cyBvYnNlcnZlZCBpbiBTTA0KDQpgYGB7cn0NCkJpb21hc3MuU0wlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RQMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQMikpK2dlb21fbGluZShhZXMoeT1Sb290UDMpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQNSkpK2dlb21fbGluZShhZXMoeT1Sb290UDYpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA3KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQOCkpK2dlb21fbGluZShhZXMoeT1Sb290UDkpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFAxMCkpK2dlb21fbGluZShhZXMoeT1Sb290UEEpKSt4bGFiKCJEYXRlIikrDQogIHlsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikNCg0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RHcm93dGhFM0lTTC5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NCwgZHBpPTUwMCkNCmBgYA0KDQoNCiMjIyNTUyByb290IGFuYWx5c2lzDQpgYGB7cn0NCkJpb21hc3MuU1M8LUJpb21hc3MlPiUNCiAgZmlsdGVyKElEPT0iRTNJU1MiKSU+JQ0KICBmaWx0ZXIoUm9vdFJlc3BpcmF0aW9uMSE9Ik5BIikNCkJpb21hc3MuU1MlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RSZXNwaXJhdGlvbjEpKStnZW9tX2xpbmUoc2l6ZT0xKSt0aGVtZV9idygpK215dGhlbWUzKw0KICBnZW9tX3BvaW50KGFlcyh5PVJvb3RXdCxzaXplPTIpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFJlc3BpcmF0aW9uMikpK2dndGl0bGUocGFzdGUwKCJFM0lTUyIpKSsNCiB4bGFiKCJEYXRlIikreWxhYigiUm9vdCBiaW9tYXNzIChrZy9oYSkiKSt0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbiA9ICJibGFuayIpDQpgYGAgICANCg0KIyMjcHJlZGljdGVkIHZzIG9ic3NlcnZlZA0KDQpgYGB7cn0NCkJpb21hc3MuU1MlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RQMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQMikpK2dlb21fbGluZShhZXMoeT1Sb290UDMpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQNSkpK2dlb21fbGluZShhZXMoeT1Sb290UDYpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA3KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQOCkpK2dlb21fbGluZShhZXMoeT1Sb290UDkpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFAxMCkpK2dlb21fbGluZShhZXMoeT1Sb290UEEpKSt4bGFiKCJEYXRlIikrDQogIHlsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikNCg0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RHcm93dGhFM0lTUy5wbmciLCB3aWR0aD04LCBoZWlnaHQ9NCwgZHBpPTUwMCkNCmBgYA0KDQoNCg0KDQojIyNFNUxMRjUNCmBgYHtyfQ0KQmlvbWFzcy5MTEY1PC1CaW9tYXNzJT4lDQogIGZpbHRlcihJRD09IkU1SUxMRjUiKSU+JQ0KICBmaWx0ZXIoUm9vdFJlc3BpcmF0aW9uMSE9Ik5BIikNCkJpb21hc3MuTExGNSU+JQ0KICBnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXksIHk9Um9vdFJlc3BpcmF0aW9uMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0LHNpemU9Mixjb2xvcj0iYmx1ZSIpKQ0KYGBgICAgDQoNCiMjI3ByZWRpY3RlZCB2cyBvYnNzZXJ2ZWQNCg0KYGBge3J9DQpCaW9tYXNzLkxMRjUlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RQMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQMikpK2dlb21fbGluZShhZXMoeT1Sb290UDMpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQNSkpK2dlb21fbGluZShhZXMoeT1Sb290UDYpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA3KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQOCkpK2dlb21fbGluZShhZXMoeT1Sb290UDkpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFAxMCkpK2dlb21fbGluZShhZXMoeT1Sb290UEEpKSt4bGFiKCJEYXRlIikrDQogIHlsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikNCg0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RHcm93dGhFNUlMTEY1LnBuZyIsIHdpZHRoPTgsIGhlaWdodD00LCBkcGk9NTAwKQ0KYGBgDQoNCg0KIyMjI0U1SEhGNQ0KYGBge3J9DQpCaW9tYXNzLkhIRjU8LUJpb21hc3MlPiUNCiAgZmlsdGVyKElEPT0iRTVJSEhGNSIpJT4lDQogIGZpbHRlcihSb290UmVzcGlyYXRpb24xIT0iTkEiKQ0KQmlvbWFzcy5ISEY1JT4lDQogIGdncGxvdChhZXMoeD1DbG9jay5Ub2RheSwgeT1Sb290UmVzcGlyYXRpb24xKSkrZ2VvbV9saW5lKHNpemU9MSkrdGhlbWVfYncoKStteXRoZW1lMysNCiAgZ2VvbV9wb2ludChhZXMoeT1Sb290V3Qsc2l6ZT0yKSkrZ2d0aXRsZShwYXN0ZTAoIkU1SUhIRjUiKSkrDQogeGxhYigiRGF0ZSIpK3lsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikrdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKQ0KYGBgICAgDQoNCiMjI3ByZWRpY3RlZCBWcyBvYnNlcnZlZA0KYGBge3J9DQpCaW9tYXNzLkhIRjUlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RQMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQMikpK2dlb21fbGluZShhZXMoeT1Sb290UDMpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQNSkpK2dlb21fbGluZShhZXMoeT1Sb290UDYpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA3KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQOCkpK2dlb21fbGluZShhZXMoeT1Sb290UDkpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFAxMCkpK2dlb21fbGluZShhZXMoeT1Sb290UEEpKSt4bGFiKCJEYXRlIikrDQogIHlsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikNCg0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RHcm93dGhFNUlISEY1LnBuZyIsIHdpZHRoPTgsIGhlaWdodD00LCBkcGk9NTAwKQ0KDQpgYGANCg0KDQojIyNFNVNTRjUNCmBgYHtyfQ0KQmlvbWFzcy5TU0Y1PC1CaW9tYXNzJT4lDQogIGZpbHRlcihJRD09IkU1SVNTRjUiKSU+JQ0KICBmaWx0ZXIoUm9vdFJlc3BpcmF0aW9uMSE9Ik5BIikNCkJpb21hc3MuU1NGNSU+JQ0KICBnZ3Bsb3QoYWVzKHg9Q2xvY2suVG9kYXksIHk9Um9vdFJlc3BpcmF0aW9uMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0LHNpemU9Mixjb2xvcj0iYmx1ZSIpKQ0KYGBgICANCiMjI3ByZWRpY3RlZCBWcyBvYnNlcnZlZA0KYGBge3J9DQpCaW9tYXNzLlNTRjUlPiUNCiAgZ2dwbG90KGFlcyh4PUNsb2NrLlRvZGF5LCB5PVJvb3RQMSkpK2dlb21fbGluZShzaXplPTEpK3RoZW1lX2J3KCkrbXl0aGVtZTMrDQogIGdlb21fcG9pbnQoYWVzKHk9Um9vdFd0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQMikpK2dlb21fbGluZShhZXMoeT1Sb290UDMpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA0KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQNSkpK2dlb21fbGluZShhZXMoeT1Sb290UDYpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFA3KSkrZ2VvbV9saW5lKGFlcyh5PVJvb3RQOCkpK2dlb21fbGluZShhZXMoeT1Sb290UDkpKStnZW9tX2xpbmUoYWVzKHk9Um9vdFAxMCkpK2dlb21fbGluZShhZXMoeT1Sb290UEEpKSt4bGFiKCJEYXRlIikrDQogIHlsYWIoIlJvb3QgYmlvbWFzcyAoa2cvaGEpIikNCg0KZ2dzYXZlKCJEOi9SL1BpY3R1cmVzL0M1L1lpZWxkL1Jvb3RHcm93dGhFNUlTU0Y1LnBuZyIsIHdpZHRoPTgsIGhlaWdodD00LCBkcGk9NTAwKQ0KDQpgYGANCg==